Объектно ориентированное программирование собака

ООП для “чайников”. Классы и объекты.

Недавно сделал для себя открытие, — оказывается не все хорошие программисты чётко понимают такую важную вещь как принципы объектного-ориентированния, без которого в современном программировании даже плюнуть некуда. Постараюсь восполнить этот пробел на простых примерах, как говорится «на пальцах».
Начнем с самого базового понятия, — класса. Класс, он же тип, чтобы не мучить, и не сбивать с толку формулировками, можно объяснить на примере: класс это Собака, либо Кошка, либо Мышка, — всё это классы. А вот Жучка, Мурчик и Микки-Маус, — это экземпляры классов Собака, Кошка, Мышка. Экземпляры классов еще называют объектами. Итак, – Жучка это экземпляр класса Собака, Мурчик, — экземпляр класса Кошка, а Микки-Маус, — экземпляр класса Мышка, другими словами объект. Класс — единственный и неповторимый. У вас могут быть классы очень похожие, как овчарка и доберман, но это всё равно разные классы, хоть и очень похожие. Класс представляет собой набор характеристик/свойств, которые описывают его состояние и действия/методы, которые он может выполнить. Например, — нас есть класс Овчарка, к числу её свойств можно отнести «возраст» и «кличку». Экземпляр класса может выполнять действия, описанные в классе (лаять, сидеть, лежать), а также содержит значения свойств класса (класс Овчарка имеет свойство «возраст», а объект Барбос имеет значение, — 3 года). Помимо свойств и методов, объект имеет собственное имя, не путать со свойством «кличка», вот как это может выглядеть:

Читайте также:  Вид задачи линейного программирования решаемой симплекс методом

МояСобака.кличка = «Барбос»

Что означает, что у объекта «МояСобака», есть кличка, и эта кличка — Барбос. А бывает и такая ситуация:

ХозяинСобаки.имя = «Василий»
ХозяинСобаки.отчество = «Иванович»

Тут у нас объект «ХозяинСобаки», у которого свойство «имя» имеет значение «Василий», а отчество равно «Иванович».
Похожим образом работают методы (действия) объектов, например:

МояСобака.лежать()
МояСобака.сидеть()

Методы могут параметризироваться, например, мы знаем что метод «лаять» заданное количество раз:

МояСобака.лаять(3)

Объект всегда должен быть создан. Класс существует как факт, то есть, всегда. Создание объекта выглядит в разных языках программирования по-разному, хотя чаще всего это выглядит так:

МояСобака = new Собака()

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

МояСобака = new Собака(«Барбос»)

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

Источник

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

Объектно-ориентированное программирование. Язык С++

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. Создадим наследников

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. Наследование

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

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

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

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

class CDog : CPet
public CDog()
legs = 4;
eyes = 1; // нет ошибки
>
public void Speak()
Console.WriteLine(«I’m a dog»);
>
>

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

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();

Источник

Оцените статью