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

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

Для объявления класса - потомка необходимо после ключевого слова class в скобках указать имя класса родителя и далее по общим правилам объявления классов записать поля и методы класса потомка.

Форма записи

Type

идткп = class ( идткр )

. . . . . . . . . . . . {поля и методы

. . . . . . . . . . . . класса потомка }

End;

Пример. Для работы с линиями мы можем объявить в программе класс TLine следующим образом:

 

Type TLine = class

X , Y : Integer ;

Color : Word ;

Vis : Boolean ;

XE, YE :Integer ;

procedure SetLocation ( Nx , Ny : Integer ) ;

procedure SetColor ( NewColor : Word ) ;

procedure Setvisible ( Vis : Boolean ) ;

procedure SetLineLoc ( Var Xa , Ya , Xb , Yb : Integer );

Procedure SetLineVisible ( Vis : Boolean ) ;

End ;

 

Если сравнить это объявление класса Tline с объявлением класса Tpoint (см. выше), то нетрудно заметить, что в обоих объявлениях есть общие фрагменты (выделены жирным шрифтом). Поэтому более компактную запись можно получить если объявить класс TLine как наследник класса TPoint, то есть:

 

Type TPoint = Class

. . . . . . . .

End;

TLine = class ( TPoint )

XE , YE :Integer ;

{задание нового положения линии }

procedure SetLineLoc ( Var Xa , Ya , Xb , Yb : Integer );

{ вывод или гашение линии }

procedure SetLineVisible ( Vis : Boolean ) ;

End ;

Таким образом механизм наследования позволяет существенно сократить затраты на описание классов.

Замечания:

1. Класс родитель должен быть объявлен до класса потомка.

2. Потомок наследует данные и методы не только своего непосредственного родителя, но и всех предшествующих предков. Например, если имеем структуру классов, приведенную на рис. 5.22.1, то класс D наследует данные и методы всех предшествующих классов, т.е. классов В и А.

 

Рис.5.22.1. Иерархия классов

 

3. У каждого класса может быть сколько угодно потомков и только один непосредственный предок (например, у класса E на рис. 5.22.1 только один непосредственный предок - класс В).

Наследование позволяет создавать иерархию классов. Эта иерархия может иметь сложную древовидную структуру.

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

В Object Pascal у всех классов есть один общий исходный предок класс TObject - родоначальник всех других классов. Этот класс обладает минимальным набором возможностей пригодных для любых классов.

Замечание. Вопрос- что будет если класс потомок использует в конкретной программе не все наследуемые поля и методы. Оказывается, что никаких проблем при этом не возникает. Компоновщик (одна из программ компилятора) тщательно проверит всю программу и удалит из нее все поля и методы, которые в ней не используются. Поэтому в исполняемую программу (exe-файл) будут включены только те методы и поля, которые используются в программе.