#26 Наследование классов в Паскале. Базовые сведения: Родитель, потомок, дочерний класс. ООП
Primary tabs
Наследование - это механизм, который дает возможность получать доступ к элементам (методам, полям) другого класса, если этот другой класс объявить "родительским" для данного.
Рассмотрим примеры, чтобы разобраться с тем, как это происходит на практике
Пример №1 - Наследование метода
Предположим у нас есть программа с классом:
type Hello = class public procedure sayHello(); end; procedure Hello.sayHello(); begin writeln('Привет!'); end; var primer: Hello; begin primer := Hello.create(); primer.sayHello(); end.
и мы хотим создать еще один класс, который бы умел не только, здороваться, но и прощаться, при этом нам не хочется заново писать метод для привествия.
Именно в такой ситуации мы можем просто взять и унаследоваться от уже реализованного класса Hello:
type Hello = class // родительский класс public procedure sayHello(); end; HelloAndBye = class(Hello) // класс-потомок public procedure sayBye(); end; // далее релаизация методов procedure Hello.sayHello(); begin writeln('Привет!'); end; procedure HelloAndBye.sayBye(); begin writeln('Пока!'); end; var Primer: Hello; ByePrimer: HelloAndBye; begin Primer := Hello.create(); Primer.sayHello(); ByePrimer := HelloAndBye.create(); ByePrimer.sayHello(); // использует метода родителя ("наследуемый") ByePrimer.sayBye(); // собственный метод end.
Пример №2 - Наследование нестандартного конструктора
Наследовать можно и нестандартный конструктор (т.е. такой, что принимает параметры), это позволит сделать поведение классов более гибким, рассмотрим пример:
type Cat = class // родительский класс public name: string; procedure sayHello(); constructor create(nameValue: string); end; Tiger = class(Cat) // класс-потомок end; constructor Cat.create(nameValue: string); begin self.name := nameValue; end; procedure Cat.sayHello(); begin writeln('Привет, я ' + self.name + '!'); end; var CatItem: Cat; TigerItem: Tiger; begin CatItem := Cat.create('Мурка'); CatItem.sayHello(); TigerItem := Tiger.create('Шархан'); TigerItem.sayHello(); end.
- в этом пример:
- У нас есть два класса- Кошка (Cat) и Тирг (Tiget)
- Класса тигра наследуется от класса кошки (можно сказать также "класс тигра является потомком класса кошки" или "класс кошки является родительским для класса тигра")
- При этом заметьте - класс тигра вообще не вносит ничего нового, кроме имени типа класса (Tiger), все свое поведение он получает от родительского класса
- В числе прочего тигр наследует от кошки и конструктор, реализация, которого позволяет сохранить передаваемый строковый параметр в поле name как имя данного зверя
- В конце для иллюстрации работы мы создали два экземпляра класса - один объект класса тигра - конкретный тигр Шархан и один и объект-кошка по кличке Мурка и показали, что Шархану, в силу того, что его класс наследует классу "Кошка" автоматически доступно констуруирование с параметром и обращение к методу sayHello(), все это получено от родительского класса через механизм наследования.
Подведем итог: в примере выше класс тигра унаследовал от класса кошки три элемента:
- поле name
- нестандартный конструктор, который умеет записывать в это поле переданное стороковое значение
- метод sayHello()
Видео-материалы
- Фрагмент лекции: Наследование Классов в Паскале. Введение : https://youtu.be/dhIKIFdHxPE
- Наследование конструктора: https://youtu.be/pU7s-TgTzlY
- Передача параметра в конструктор и сохранение его в поле класса - разбор кода: https://youtu.be/sl0Y5uYajio
- О полиморфизме: https://youtu.be/KISHYwG8VgA
Задачи для самостоятельного решения
Ответьте на вопросы:
- Что такое наследование? Зачем оно нужно?
- Сколько минунимум классов нужно, что продемонстрировать процесс наследования?
-
У вас есть код:
type Cat = class // родительский класс public name: string; procedure sayHello(); constructor create(nameValue: string); end; Tiger = class(Cat) // класс-потомок end; constructor Cat.create(nameValue: string); begin self.name := nameValue; end; procedure Cat.sayHello(); begin writeln('Привет, я ' + self.name + '!'); end; var CatItem: Cat; TigerItem: Tiger; begin CatItem := Cat.create('Мурка'); CatItem.sayHello(); TigerItem := Tiger.create('Шархан'); TigerItem.sayHello(); end.
-- добавим в эту систему еще две сущности: лев (Lion) и Амурский тирг (AmurTiger), реализуйте для них класса (унаследовавшись от от тех объектов уже имеющихся наиболее близких для них классов, причем у каждого из новых классов должен быть свой родитель из двух имеющихся). Создайте этим новым классам экзепляры - и пусть они поздороваются)
Решите задачи
- Log in to post comments
- 2265 reads
vedro-compota
Sat, 02/18/2023 - 13:53
Permalink
type
type
Cat = class // родительский класс
public
name: string;
const typeName = 'кошка';
constructor create(nameValue: string);
procedure sayHello();
end;
Tiger = class(Cat) // класс-потомок
public
procedure sayBye();
end;
// далее релаизация методов
procedure Cat.create(nameValue: string);
begin
writeln('Привет, я !');
end;
procedure HelloAndBye.sayBye();
begin
writeln('Пока!');
end;
var
Primer: Hello;
ByePrimer: HelloAndBye;
begin
Primer := Hello.create();
Primer.sayHello();
ByePrimer := HelloAndBye.create();
ByePrimer.sayHello(); // использует метода родителя ("наследуемый")
ByePrimer.sayBye(); // собственный метод
end.
_____________
матфак вгу и остальная классика =)