
- •Объектно – ориентированное программирование
- •Недостатки структурного программирования
- •Недостатки структурного программирования
- •Объектно – ориентированное программирование
- •Основные понятия
- •Инкапсуляция.
- •Наследование.
- •Таксономия
- •Полиморфизм («много форм»)
- •Пример полиморфизма
- •Объекты в языке Паскаль
- •Поля объекта
- •Другой вариант
- •Методы
- •Доступ только через методы
- •Секция private
- •Наследование
- •Правила наследования
- •Наследование
- •Наследование
- •Полиморфизм. Раннее связывание.
- •Полиморфизм. Раннее
- •Позднее связывание
- •Конструктор. Позднее
- •Правила виртуальных методов
- •Динамические объекты
- •Пример программы
- •Constructor List.Init; Begin
- •Procedure List.AddNew(Item : TypeElem); Var Temp : NodePtr;
- •Var i:byte;
- •Посторение графика функции
- •Поддержка графики
- •Инициализация графического
- •Инициализация графического режима
- •Система координат
- •Коэффициент сжатия
- •Масштаб
- •Задание осей координат
- •Разметка осей
- •Задание графика
- •Вычисление координат точек
- •Построение графика
- •Выход за пределы экрана

Полиморфизм. Раннее связывание.
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.