Наследование как средство усложнения базового класса
Реализуется путем определения в классе-потомке дополнительных полей, методов и свойств. Класс-потомок будет иметь:
• Унаследованные поля, методы и свойства
• Дополнительные поля, методы и свойства
Конструкторы не наследуются, поэтому класс-потомок должен иметь собственный конструктор. При создании объекта класса-потомка конст- рукторы должны вызываться, начиная с базового класса. В начале ини- циализируются унаследованные поля, потом – специфические поля, как показано на Рис.2.
![]() |
Рис.2
Указанная очередность вызовов реализуется одним из способов:
1. Конструктор потомка не имеет вызова конструктора-предка. Авто- матически вызывается конструктор предка без параметров.
2.
![]() |
Пример: определить базовый класс «Человек». Человек характеризу- ется фамилией и умением сообщать свою фамилию. Потомками класса
«Человек» являются:
-класс «Владелец», дополнительно характеризующийся номером ав- томобиля и умением сообщать его
-класс “Служащий”, дополнительно характеризующийся названием фирмы и умением сообщать его.
-класс “Студент”, дополнительно характеризующийся названием ВУЗа
class Человек
{
protected string фам; public Человек(string фам)
{
this.фам = фам;
}
public void Показать()
{
Console.WriteLine("Я - человек: " + фам);
}
}
class Студент:Человек
{
private string вуз;
public Студент(string фам, string вуз):base(фам)
{
this.вуз = вуз;
}
}
class Владелец: Человек
{
private string ном;
public Владелец(string фам, string ном): base(фам)
{
this.ном = ном;
}
public void Инфо()
{
Console.WriteLine("Я - владелец: "+фам+" --> " + ном);
}
}
class Служащий: Человек
{
private string фирма;
public Служащий(string фам, string фирма): base(фам)
{
this.фирма = фирма;
}
public void Инфо()
{
Console.WriteLine("Я - служащий: "+фам + " " + фирма);
}
}
class Program
{
static void Main(string[] args)
{
Студент ст = new Студент("Иванов","ВШЭ");
Владелец вл = new Владелец("Петров", "A777AA-99RUS");
Служащий сл = new Служащий("Сидоров", "Рога и копыта");
ст.Показать(); //Унаследованный метод
//Я - человек: Иванов
вл.Показать(); //Унаследованный метод
//Я - человек: Петров
сл.Инфо(); // Дополнительно определенный метод
//Я - служащий: Сидоров Рога и копыта
вл.Инфо(); //Дополнительно определенный метод
//Я - владелец: Петров --> A777AA-99RUS
}
}
Для работы с объектом-потомком могут быть использованы ссылки типа Предок и Потомок. Ссылке базового класса можно присвоить ссыл- ку на класс-потомок. Ссылки типа Предок можно использовать только для доступа к унаследованным полям, методам и свойствам (предок ни- чего не знает о том, что «привнесли» потомки).
![]() |
Рис.4
class Человек
{
protected string фам; public Человек(string фам)
{
this.фам = фам;
}
public void Показать()
{
Console.WriteLine("Я - человек: " + фам);
}
}
class Владелец: Человек
{
private string ном;
public Владелец(string фам, string ном): base(фам)
{
this.ном = ном;
}
public void Инфо()
{
Console.WriteLine("Я - владелец: "+фам+" --> " + ном);
}
}
class Program
{
static void Main(string[] args)
{
Человек ч;
Владелец вл = new Владелец("Петров", "A777AA-99RUS");
ч = вл;
ч.Показать(); //Унаследованный метод
//Я - человек: Петров
вл.Показать(); //Унаследованный метод
//Я - человек: Петров ч.Инфо(); //Ошибка
вл.Инфо(); //Дополнительно определенный метод
//Я - владелец: Петров --> A777AA-99RUS
}
}
Возможность усложнять базовый класс может рассматриваться как альтернатива агрегации. При этом необходимо помнить, что механизмы наследования и агрегации реализуются по-разному.
Наследование – это аналог производства изделия «с нуля». Базовый чертеж (класс) дополняется и полученный чертеж изделия (класс- наследник) используется для изготовления изделия (объекта). На этапе
выполнения нет деления объекта на предка и потомка – это единый объ- ект.
Агрегация – аналог производства изделия методом «отверточной сборки». Изготовленные по отдельным чертежам детали (объекты)
соби- раются в более сложное изделие
(объект). Класс-контейнер – это сбо- рочный
чертеж изделия, определяющий его составные части. На этапе выполнения сохраняется четкое деление
объекта на контейнер и часть. Это самостоятельные объекты.
Владелец |
|
Человек |
|
чел ном |
фам |
||
|
|||
Инфо() |
Показать() |
![]() |
включить объект
Рис.5
class Человек
{
public string фам;
public Человек(string фам)
{
this.фам = фам;
}
public void Показать()
{
Console.WriteLine("Я - человек: " + фам);
}
}
class Владелец
{
public Человек чел; private string ном;
public Владелец(Человек чел, string ном)
{
this.чел = чел; this.ном = ном;
}
public void Инфо()
{
Console.WriteLine("Я - владелец: "+чел.фам+" --> " + ном);
}
}
class Program
{
static void Main(string[] args)
{
Человек ч = new Человек("Петров");
Владелец вл = new Владелец(ч,"A777AA-99RUS");
вл.чел.Показать();
//Я - человек: Петров
вл.Инфо();
//Я - владелец: Петров --> A777AA-99RUS
}
}
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.