Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч


Download 2.46 Mb.
bet42/91
Sana19.10.2023
Hajmi2.46 Mb.
#1709453
TuriУчебно-методический комплекс
1   ...   38   39   40   41   42   43   44   45   ...   91
Bog'liq
Язык программирования C#

9. НАСЛЕДОВАНИЕ И ПОЛИМОРФИЗМ

Основу объектно-ориентированного программирования помимо инкапсуляции составляют наследование и полиморфизм. Именно эти две составляющие и сделали ООП ведущим подходом в современной разработке.




9.1. Наследование

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


Класс, от которого произошло наследование, называется базовым или родительским. Классы, которые произошли от базового, называются потомками, наследниками или производными классами.
В языке C# класс может иметь только одного родителя, то есть поддерживается только единичное наследование.
Общий формат для определения класса потомка от некоторого базового класса имеет следующий вид.


class имя_класса : имя_базового_класса
{
// определение полей
}

Как видите, синтаксис наследования в языке C# до гениальности прост. После имени создаваемого класса ставится двоеточие, а за ним имя базового класса. Наследовать можно только от классов, находящихся в области видимости сборки, содержащий создаваемый класс. Производный класс может обращаться к открытым public защищенным private и сборочным internal членам родительского класса.


Создадим для иллюстрации вышесказанного пример иерархии классов, состоящей из двух классов: базового Pet и производного от него класса Cat.
Определим в начале базовый класс домашнего животного Pet, имеющего поля только для имени и возраста животного, свойства для доступа к этим полям и конструктор для их базовой инициализации.

class Pet


{
private string sName;
private int iAge;

public string Name


{
get
{
return sName;
}
}

public int Age


{
get
{
return iAge;
}
protected set
{
iAge = value;
}
}

public Pet(string Name)


{
sName = Name;
iAge = 0;
}
}
Лист. 9.1

Особое внимание в этом листинге следует обратить на свойство Age. Аксесор get этого свойства доступен для общего доступа, так как имеет модификатор доступа public, аксесор же set, имея модификатор доступа protected, доступен только внутри класса и для его потомков.


Теперь, используя класс Pet в качестве родителя, определим дочерний класс кошки Cat. Это класс добавляет к базовому классу методы, позволяющие нашей кошке расти, мяукать и выводящие информацию о ней, а также поле для хранения цвета кошки и все необходимое для работы с ним.


class Cat : Pet


{
string sColor;

string Color


{
set
{
sColor = value;
}

get
{


return sColor;
}
}

public void Grow()


{
if (Age <= 20)
Age++;
else
{
Age = -1;
Console.WriteLine(Name + " умерла от старости.");
}
}

public void Meow()


{
if (Age < 0)
Console.WriteLine(Name + "Отмяукалась");
else
Console.WriteLine(Name + ": Мяу Мяу Мяу");
}

public void ShowState()


{
Console.WriteLine(Name);
Console.WriteLine("Возраст: " + Age);
Console.WriteLine("Цвет: " + Color);
}

public Cat(string Name, int iAge, string Color) : base(Name)


{
if (iAge > 20)
{
Console.WriteLine("Слишком много для кошки " + Name);
Age = -1;
}
else
Age = iAge;
sColor = Color;
}
}
Лист. 9.2

В приведенном примере следует подробно разобрать методы Grow(), ShowState() и Meow() , а также конструктор.


Методы Grow(),ShowState() и Meow() обращаются к свойствам базового класса Age и Name.
Методы ShowState() и Meow() обращаются к свойствам Age и Name только для чтения, обращаясь к public аксесору этих свойств, они, как и другие общедоступные члены класса доступны и для самого класса, и для его потомков и для внешних классов.
Метод Grow() также считывает поле базового класса, обращаясь к public аксесору свойства Age. Помимо этого метод Grow() обращается к protected аксесору set свойства Age для сохранения нового возраста кошки, как и другие защищенные члены класса аксесор set доступен только классу, в котором он объявлен и его потомкам.
Перед тем как создать класс потомок необходимо вызвать конструктор базового класса, чтобы поля базового класса были к этому моменту уже проинициализированы. Для этого в заголовке конструктора класса Cat.

public Cat(string Name, int iAge, string Color) : base(Name)


Лист. 9.3

Стоит обращение к конструктору базового класса с повторной передачей ему параметра Name, переданного ранее самому конструктору класса Cat.


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


имя_производного_класса(список_параметров): base(список_аргументов)


{
// тело конструктора
}

В этой схеме список аргументов, передаваемых конструктору базового класса, формируется из списка формальных параметров конструктора класса производного.


Чтобы убедится в работоспособности нашей иерархии, создадим тестирующую ее программу.


class Program


{
static void Main(string[] args)
{
Cat[] Cats = new Cat[3];
Cats[0] = new Cat("Зося", 30, "Рыжий");
Cats[1] = new Cat("Лител", 2, "Непонятный");
Cats[2] = new Cat("Вадя", 5, "Балотный");

for (int i = 0; i < 3; i++)


Cats[i].ShowState();

for (int i = 0; i < 3; i++)


Cats[i].Meow();

for (int i = 0; i < 3; i++)


Cats[i].Grow();

for (int i = 0; i < 3; i++)


Cats[i].ShowState();
}
}
Лист. 9.4

В этом примере создается массив Cats класса Cat из 3-х элементов. Далее элементы


этого массива инициализируются и вызываются методы каждого из этих элементов.
Вывод программы:

Слишком много для кошки Зося


Зося
Возраст: -1
Цвет: Рыжий
Лител
Возраст: 2
Цвет: Непонятный
Вадя
Возраст: 5
Цвет: Балотный
ЗосяОтмяукалась
Лител: Мяу Мяу Мяу
Вадя: Мяу Мяу Мяу
Зося
Возраст: 0
Цвет: Рыжий
Лител
Возраст: 3
Цвет: Непонятный
Вадя
Возраст: 6
Цвет: Балотный
Вывод 9.1



Download 2.46 Mb.

Do'stlaringiz bilan baham:
1   ...   38   39   40   41   42   43   44   45   ...   91




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling