Объектно-ориентированное программирование
Наследование
Наследование
Наследование
Наследование
Наследование
Наследование
Наследование
Наследование
Наследование
Наследование
Наследование
класс "Питомец"
класс "Питомец"
Наследование
Создадим наследников
Наследование
Наследование
Наследование
Наследование
Наследование
Наследование
Наследование
Добавим свои слова собаке
Наследование
Наследование
Наследование
Наследование
Наследование
Наследование
Наследование
Наследование
Наследование
Наследование
Класс "Рыбка"
Класс "Акула"
Наследование
Диаграмма классов
1.98M
Категория: ПрограммированиеПрограммирование

Объектно-ориентированное программирование. Наследование

1. Объектно-ориентированное программирование

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

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

Насле́дование

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

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

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

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

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

Класс, от которого произошло наследование,
называется базовым или родительским (base
class). Классы, которые произошли от базового,
называются
потомками,
наследниками,
подклассами или производными классами
(derived class).

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

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

При наследовании все атрибуты и методы
родительского
класса
наследуются
классомпотомком.
Наследование может быть многоуровневым, и тогда
классы, находящиеся на нижних уровнях иерархии,
унаследуют все свойства (атрибуты и методы) всех
классов, прямыми или косвенными потомками
которых они являются.
Класс B унаследует атрибуты и методы класса A и,
следовательно, будет обладать атрибутами A, B, C и D
и методами A, B, C и D, а класс C – атрибутами A, B,
C, E, F и методами A, B и E.

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

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

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

При наследовании одни методы класса могут
замещаться другими. Так, класс транспортных
средств будет обладать обобщенным методом
движения. В классах-потомках этот метод будет
конкретизирован: автомобиль будет ездить,
самолет – летать, корабль – плавать. Такое
изменение
семантики
метода
называется
полиморфизмом.
Полиморфи́зм — возможность объектов с
одинаковой спецификацией иметь различную
реализацию. (Один интерфейс, множество
реализаций)

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

class имя_наследника: имя_базового_класса
{тело класса}
Наследник обладает всеми полями, методами и
свойствами предка, однако элементы предка с
модификатором private не доступны в
наследнике.
При наследовании нельзя расширить область
видимости
класса:
internal–класс
может
наследоваться от public–класса, но не наоборот

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

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

13. класс "Питомец"

класс "Питомец"
class CPet
{
public int eyes = 2; //глаза
public int tail;
// хвост
public int legs;
// ноги
public CPet()
{
tail = 1;
}
public void Speak()
{
Console.WriteLine("I'm a pet");
}
}

14. класс "Питомец"

класс "Питомец"
Это общий класс.
В нем могут быть все виды питомцев
(собаки, птички, рыбки).
У всех 2 глаза, 1 хвост и какое-то кво ног. Все могут говорить.

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

CPet Pet = new CPet();
Console.WriteLine("Pet.eyes = "+ Pet.eyes);
Console.WriteLine("Pet.tail = "+ Pet.tail);
Console.WriteLine("Pet.legs = "+ Pet.legs);
Pet.Speak();

16. Создадим наследников

class CDog : CPet
{
public CDog()
{
legs = 4;
}
}
class CBird : CPet
{
public int wings = 2;
}

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

CDog Dog = new CDog();
Console.WriteLine("Dog.eyes = "+ Dog.eyes);
Console.WriteLine("Dog.tail = "+ Dog.tail);
Console.WriteLine("Dog.legs = "+ Dog.legs);
Dog.Speak();
CBird Bird = new CBird();
Console.WriteLine("Bird.eyes = "+ Bird.eyes);
Console.WriteLine("Bird.tail = "+ Bird.tail);
Console.WriteLine("Bird.legs = "+ Bird.legs);
Console.WriteLine("Bird.wings = " + Bird.wings);
Bird.Speak();

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

Собаки имеют свой конструктор с к-вом ног = 4. У
птиц появилось новое поле – крылья.
Все пока говорят одно и тоже.
Обратите внимание, что родительский
конструктор сработал во всех случаях (это
хвост).

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

Все члены родительского класса public.
Давайте попробуем сделать скрытыми
глаза:
int eyes = 2;
//глаза

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

То, что появятся ошибки при выводе, понятно.
(закомментируем). Но как быть с наследниками?
Наследники должны видеть члены родительского
класса.

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

Давайте заведем одноглазую собаку.
private скрывает и от наследников.

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

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

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

24. Добавим свои слова собаке

class CDog : CPet
{
public CDog()
{
legs = 4;
eyes = 1; // нет ошибки
}
public void Speak()
{
Console.WriteLine("I'm a dog");
}
}

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

Теперь команда
Dog.Speak();
даст результат:

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

Но такая грубая перегрузка метода
вызовет предупреждение.

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

Для явного указания компилятору, что
мы знаем, что делаем, используется
слово new.
new public void Speak()
{
Console.WriteLine("I'm a dog");
}
Такой способ называется скрытием
метода.

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

Класс-наследник
может
собственных наследников.
иметь
class CMutant : CDog
{
public CMutant()
{
legs = 5;
}
new public void Speak()
{
Console.WriteLine("I'm a mutant");
}
}

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

CMutant Mutant = new CMutant();
Console.WriteLine("Mutant.eyes = " + Mutant.eyes);
Console.WriteLine("Mutant.tail = " + Mutant.tail);
Console.WriteLine("Mutant.legs = " + Mutant.legs);
Mutant.Speak();

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

Но при этом она еще помнит, что она
собака. Метод Speak вызывает метод
Speak родительского класса (который
был скрыт):

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

class CMutant : CDog
{
public CMutant()
{
legs = 5;
}
new public void Speak()
{
base.Speak();
Console.WriteLine("I'm a mutant");
}
}

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

Для этого используется ключевое слово
base. Кстати, для обращения к
собственному
объекту,
если
это
необходимо, используется слово this.

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

Обратите
внимание,
как
здесь
сработали
конструкторы: сначала был вызван конструктор
самого первого предка (CPet). Один хвост задавался
именно там. Потом сработал конструктор его
потомка: CDog. 4 ноги и 1 глаз. И уже в последнюю
очередь – собственный конструктор CMutant – ног
стало 5.

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

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

35. Класс "Рыбка"

Класс "Рыбка"
class CFish : CPet
{
public int fins; // плавник
public CFish(int eyes, int tail, int fins)
{
this.eyes = eyes;
this.tail = tail;
this.fins = fins;
}
}

36. Класс "Акула"

Класс "Акула"
class CShark : CFish
{
public int teeth; // зубы
public CShark(int eyes, int tail, int
fins, int teeth)
: base(eyes, tail, fins)
{
this.teeth = teeth;
}
}

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

CShark Shark = new CShark(2, 1, 4, 100);
Console.WriteLine("Shark.eyes = " + Shark.eyes);
Console.WriteLine("Shark.tail = " + Shark.tail);
Console.WriteLine("Shark.legs = " + Shark.fins);
Console.WriteLine("Shark.teeth = " + Shark.teeth);
Shark.Speak();

38. Диаграмма классов

English     Русский Правила