Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 178

Тип «наследник» иногда называется производным типом, а тип, от которого производится наследование («прародитель») — прародительским типом. Таким образом, отличие объекта от записи состоит не только в объединении полей и методов «под одной крышей», но и в способности объектов к наследованию. Поля и методы прародителя могут появляться в телах методов наследника, как если бы они были объявлены явно. На рис. 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 ); {задание позиции }