#26 Наследование классов в Паскале. Базовые сведения: Родитель, потомок, дочерний класс. ООП

Наследование - это механизм, который дает возможность получать доступ к элементам (методам, полям) другого класса, если этот другой класс объявить "родительским" для данного.

Рассмотрим примеры, чтобы разобраться с тем, как это происходит на практике

Пример №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.    

- в этом пример:

  1. У нас есть два класса- Кошка (Cat) и Тирг (Tiget)
  2. Класса тигра наследуется от класса кошки (можно сказать также "класс тигра является потомком класса кошки" или "класс кошки является родительским для класса тигра")
  3. При этом заметьте - класс тигра вообще не вносит ничего нового, кроме имени типа класса (Tiger), все свое поведение он получает от родительского класса
  4. В числе прочего тигр наследует от кошки и конструктор, реализация, которого позволяет сохранить передаваемый строковый параметр в поле name как имя данного зверя
  5. В конце для иллюстрации работы мы создали два экземпляра класса - один объект класса тигра - конкретный тигр Шархан и один и объект-кошка по кличке Мурка и показали, что Шархану, в силу того, что его класс наследует классу "Кошка" автоматически доступно констуруирование с параметром и обращение к методу sayHello(), все это получено от родительского класса через механизм наследования.

Подведем итог: в примере выше класс тигра унаследовал от класса кошки три элемента:

  1. поле name
  2. нестандартный конструктор, который умеет записывать в это поле переданное стороковое значение
  3. метод sayHello()

Видео-материалы

Задачи для самостоятельного решения

Ответьте на вопросы:

  1. Что такое наследование? Зачем оно нужно?
  2. Сколько минунимум классов нужно, что продемонстрировать процесс наследования?
  3. Решите задачи

  4. У вас есть код:
    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), реализуйте для них класса (унаследовавшись от от тех объектов уже имеющихся наиболее близких для них классов, причем у каждого из новых классов должен быть свой родитель из двух имеющихся). Создайте этим новым классам экзепляры - и пусть они поздороваются)

vedro-compota's picture

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.

_____________
матфак вгу и остальная классика =)