Наследование как средство усложнения базового класса
Оценка 4.8

Наследование как средство усложнения базового класса

Оценка 4.8
docx
18.11.2021
Наследование как средство усложнения базового класса
Л2-002128.docx

Наследование как средство усложнения базового класса

Реализуется путем определения в классе-потомке дополнительных полей, методов и свойств. Класс-потомок будет иметь:

                                Унаследованные поля, методы и свойства

                                Дополнительные поля, методы и свойства

Конструкторы не наследуются, поэтому класс-потомок должен иметь собственный конструктор. При создании объекта класса-потомка конст- рукторы должны вызываться, начиная с базового класса. В начале ини- циализируются унаследованные поля, потом – специфические поля, как показано на Рис.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

}

}

Возможность усложнять базовый класс может рассматриваться как альтернатива агрегации. При этом необходимо помнить, что механизмы наследования и агрегации реализуются по-разному.

Наследование – это аналог производства изделия «с нуля». Базовый чертеж (класс) дополняется и полученный чертеж изделия (класс- наследник) используется для изготовления изделия (объекта). На этапе


выполнения нет деления объекта на предка и потомка – это единый объ- ект.

Агрегация аналог производства изделия методом «отверточной сборки». Изготовленные по отдельным чертежам детали (объекты) соби- раются в более сложное изделие (объект). Класс-контейнер – это сбо- рочный чертеж изделия, определяющий его составные части. На этапе выполнения сохраняется четкое деление объекта на контейнер и часть. Это самостоятельные объекты.

 

 

 

Владелец

 

Человек

чел ном

фам

 

Инфо()

Показать()

 

100	А777АА-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

}

}


 

Наследование как средство усложнения базового класса

Наследование как средство усложнения базового класса

Пример: определить базовый класс «Человек»

Пример: определить базовый класс «Человек»

Инфо () { Console.WriteLine("Я - служащий: "+фам + " " + фирма); } } class

Инфо () { Console.WriteLine("Я - служащий: "+фам + " " + фирма); } } class

Человек { protected string фам ; public

Человек { protected string фам ; public

Агрегация – аналог производства изделия методом «отверточной сборки»

Агрегация – аналог производства изделия методом «отверточной сборки»

Инфо() { Console.WriteLine("Я - владелец: "+чел

Инфо() { Console.WriteLine("Я - владелец: "+чел
Скачать файл