Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проги, ЛЕКЦИИ / Программирование Лекция 13 ооп.pps
Скачиваний:
39
Добавлен:
12.02.2015
Размер:
289.28 Кб
Скачать

Полиморфизм. Раннее связывание.

Type ta=object Procedure Out;end; Procedure ta.out; begin writeln(‘ta.out’);end; tb=object Procedure Out;end;

Procedure tb.out; begin writeln(‘tb.out’);end; Var a:ta;b:tb;

Begin

a.out; {ta.out} b.out; {tb.out}

End.

Полиморфизм. Раннее

связываниеType ta=object . Function OutStr:string;

Procedure Out;end;

Procedure ta.out; begin writeln(OutStr);end; Function ta.OutStr:string;begin OutStr:=‘ta.out’;end; tb=object(ta) Function OutStr:string;end;

Function tb.OutStr:string; begin OutStr:=‘tb.out’;end;

Var a:ta;b:tb; Begin

a.out; {ta.out} b.out; {ta.out}

End.

Позднее связывание

Виртуальный метод дополняется директивой VIRTUAL

Обязательно обращение к конструктору, до использования виртуального метода.

Конструктор – разновидность процедуры

CONSTRUCTOR <имя блока>(<форм.пар-ры>)

Конструктор. Позднее

связываниеType ta=object .

Function OutStr:string;Virtual; Procedure Out; Constructor Init; end;

Procedure ta.out; begin writeln(OutStr);end; Constructor ta.init; begin end;

Function ta.OutStr:string;begin OutStr:=‘ta.out’;end; tb=object(ta)

Function OutStr:string; Virtual; Constructor Init; end;

Function tb.OutStr:string; begin OutStr:=‘tb.out’;end; Constructor tb.init; begin end;

Var a:ta; b:tb; Begin a.init; b.init;

a.out; {ta.out} b.out; {tb.out}

End.

Правила виртуальных методов

Если метод объявлен как виртуальный, то в типе потомка его нельзя перекрыть статическим методом;

Конструктор не может быть виртуальным; Конструктор вызывается для каждого объекта, а не класса, до вызова виртуальных методов.

списки переменных, типы функций в заголовках перекрывающих друг друга виртуальных процедур и функций должны совпадать полностью;

Динамические объекты

type

TLine = object

...

Constructor Init;

Destructor Done; end;

var Pline: ^Tline;

...

New(PLine, Init); {Размещение динам. объекта}

...

Dispose(PLine, Done);

Пример программы

type

NodePtr = ^Node; Node = record

Item : TypeElem;

Next : NodePtr;{Указатель на следущий элемент} end;

List = Object

CurNode : NodePtr; Constructor Init;

Destructor LastStep; Virtual; Procedure AddNew(Item : TypeElem); End;

Constructor List.Init; Begin

CurNode:=nil; {CurNode - указатель на начало списка}

End;

Destructor List.LastStep;

Var Temp : NodePtr; Begin

While CurNode <> nil Do Begin Temp:=CurNode; CurNode:=Temp^.Next;

Dispose(Temp); {Удалить переменную из динамической памяти}

End;

End;

Procedure List.AddNew(Item : TypeElem); Var Temp : NodePtr;

Begin New(Temp);

Temp^.Item:=Item; Temp^.Next:=CurNode; {Элемент

добавляется в начало списка} CurNode:=Temp;

End;

Var i:byte;

Xlist : ^List; Begin

New(Xlist,Init);

{создаем объект-список из 10 элементов} for i:=1 to 10 do

Xlist^.AddNew(i); Dispose(Xlist,LastStep);{вызов деструктора} End.