Тип «наследник» иногда называется производным типом, а тип, от которого производится наследование («прародитель») — прародительским типом. Таким образом, отличие объекта от записи состоит не только в объединении полей и методов «под одной крышей», но и в способности объектов к наследованию. Поля и методы прародителя могут появляться в телах методов наследника, как если бы они были объявлены явно. На рис. 13.4 это иллюстрируется методом Init, который для инициализации полей
- 277 -
| >USES CRT; { в примере используется системный модуль CRT }
| >{*3десь должны быть определения, введенные на рис.13.1*}
| TYPE
| >ObjSym = OBJECT( ObjPos ) { объявление наследования }
| > Sym : Char; { поле-значение символа }
| >PROCEDURE Init(init_line, init_col : Word;
| > init_sym : Char );
| >PROCEDURE Print { метод вывода символа }
| END;
| PROCEDURE ObjSym.Init;
| BEGIN
| > ObjPos.Init( init_line, init_col ); {задание позиции }
| > Sym := init_sym { задание значения символа }
| END;
| PROCEDURE ObjSym.Print;
| BEGIN
| > CRT.GotoXY(Col, Line); {процедура из библиотеки CRT}
| > Write( Sym ) { вывод символа в позиции }
| END;
Рис. 13.4
Line и Col, «по наследству» перешедших к объекту ObjSym, пользуется наследуемой процедурой ObjPos.Init.
Продолжая ряд наследования, можно ввести объект, описывающий символ совместно с его цветовым атрибутом. Для этого достаточно описать объект, производный от ObjSym и добавляющий поле данных для атрибута и методы его назначения или опроса. Такой объект будет третьим уровнем наследования, если считать от базового объекта ObjPos. Но можно объявить и объект того же уровня наследования по отношению к ObjPos, что и ObjSym. Определим, к примеру, объект «подстрока» (он пригодится в последующих примерах). Для задания подстроки надо указать координаты ее начала номер строки и столбца) и само содержимое подстроки, которое содержит в себе указание на ее длину. Можно создать объект типа ObjString, описывающий подстроку, как производный от объекта-позиции (рис. 13.5).
Процесс наследования является транзитивным: если тип объекта TypeB наследуется от типа объекта TypeA, а тип TypeC наследуется от TypeB, то тип объекта TypeC также считается наследником типа TypeA. Таким образом, можно получить иерархию объектов, связан-
- 278 -
| TYPE
| >ObjString = OBJECT( ObjPos )
| >SubSt : String; { поле-значение подстроки }
| PROCEDURE Init( init_line, init_col:Word;
| >init_ss:String );
| PROCEDURE Print { вывод SubSt в позиции }
| END;
| PROCEDURE ObjString.Init; { инициализация полей объекта }
| BEGIN
| >ObjPos.Init( init_tine, init_col ); {задание позиции }