Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
выш.мат. методичка.DOC
Скачиваний:
32
Добавлен:
13.02.2015
Размер:
1.71 Mб
Скачать

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

Если из рассматриваемого примера взять тип tStructure (структура), то струк­туру текста можно задать ее начальным и конечным элементами и связями меж­ду отдельными элементами структуры. Связи между отдельными элементами за­даются типом tСоnnection, и было бы нецелесообразно при создании нового типа tStructure заново задавать эти связи. Чтобы этого избежать, в ООП заложено свойство наследования характеристик одного объекта другим. Для этого один из объектов объявляется потомком другого, который, в свою очередь, становится предком этого нового объекта. Потомок наследует все параметры своего предка и его методы, поэтому вторично их описывать нет необходимости, а использовать можно. Это существенно упрощает запись схожих объектов, если установить между ними наследственную связь.

В примере редактора используемые объекты образуют наследственную, струк­туру, которая изображена на рис. 2. В частности, когда задается тип tStructure, его можно объявить потомком типаtСоnnection(для этого следует после зарезервированного слова оbjесtв круглых скобках указать имя типа-предка):.

tуре

tStructure = оbject(tСоnnection) {tStructure - потомок tСоnnection}

First: Роinter;

LastElem: Pointer;

Constructor Init;

рrосеdure РutFirstElem(FirstEl: Pointer);

рrосеdure РutLastElem(LastЕl: Роinter);

function GetFirstElem: Роinter; I

function GetLastElem: Роinter;

рrосеdure InitElem(var NewPoint: Pointer); virtual;

рrосеdure DispElem(PointDel: Pointer); virtual;

рrосеdure PutConnection(FirstPoint, SecondPoint: Pointer);

рrосеdure NewЕ1(РоintРrеdЕ1 ,РоintNextЕ1: Pointer);

рrосеdure Dе1Е1(РоintDе1: Pointer);

еnd;

В этом типе имеются собственные данные: FirstЕlеm (указатель на первый элемент структуры), LastElem (указатель на последний элемент структуры) и ме­тоды: Init (инициализация структуры), РutFirstElem (задание значения указателя на первый элемент), РutLastЕlem (задание значения указателя на последний эле­мент, GеtFirstЕlеm (получение значения указателя на первый элемент), GetLastElem (получение значения указателя на последний элемент), InitElem (инициализация - создание нового элемента), DispElem (удаление элемента), PutConnection (задание связей между двумя элементами), NewЕl (помещение в структуру нового элемента), DеlЕl (удаление из структуры элемента). Кроме них этот тип наследует от предка tConnection его данные РredЕ1еm и NехtЕlеm и методы PutPredElem, РutNехtЕlеm, DеlРredЕlеm и DеlNехtЕlеm.

В Тигbo Раsсаl непосредственный предок может быть только один. Однако он, в свою очередь, может быть потомком другого типа и т. д. В этом случае пото­мок наследует характеристики всех своих предков. Так, например, тип tLinе (строка) является потомком типа tStructurе, который, в свою очередь, является потомком типа tConnection. В связи с этим объект типа tLine может использовать параметры и методы в том числе и типа tConnection.

12.2.3. Полиморфизм

В рассматриваемом примере может возникнуть необходимость помещения того или иного символа в элемент строки, строку или весь текст. Для этого можно включить соответствующие методы в типы tЕlLine (элемент строки), tLine(стро­ка) и tТехt (текст). Естественно, что эти действия будут отличаться в зависимос­ти от того, куда помещается символ. Если символ помещается в элемент строки, то необходимо знать только номер позиции, куда следует поместить символ. Ес­ли символ помещается в строку, то сначала, исходя их координаты Х в строке, следует определить, в какой конкретно элемент строки (получить указатель на этот элемент) и в какую позицию в этом элементе необходимо поместить сим­вол. Затем, уже можно размещать символ в соответствующем элементе. Если же символ следует поместить в текст, то сначала по координате Y следует определить строку (получить указатель на эту строку), а затем уже выполнить все дей­ствия, связанные с размещением символа в строке. Таким образом, следует иметь три разные подпрограммы для трех различных типов. Т.к. все они выпол­няют, в конце концов, одно и то же действие - размещают символ в соответствую­щем месте, было бы заманчиво все их назвать одним именем. В языке Паскаль это делать запрещено - все подпрограммы должны иметь уникальные имена. Для ООП в Тurbo Раscal сделано исключение - все эти подпрограммы могут иметь одно и то же имя.

В этой возможности - иметь несколько подпрограмм с одним и тем же именем - и заключается полиморфизм ООП. Вопрос, какая же конкретно подпрограмма будет использоваться в том или ином случае, определяется типом конкретного объекта, использующего эту подпрограмму. Так, если объект типа tТехt, то будет использована подпрограмма, размещающая символ в тексте, если типа tLine, то подпрограмма, размещающая символ в строке, и т.д.

Если обратиться к рассматриваемому примеру, то у всех трех типов, о кото­рых идет речь, имеется метод с именем РutSymb, выполняющий те действия, о которых говорилось выше. Можно заметить, что список формальных параметров у этих методов различен, что вполне допустимо. Это, в частности, позволяет со­здавать подпрограммы с изменяющимся набором формальных параметров, что недопустимо в стандарте языка Паскаль. В рассматриваемом примере можно на­блюдать и другие подпрограммы с одинаковыми именами.