- •Аннотация.
- •Введение.
- •Средства объектно-ориентированного программирования. . Определение объекта. Компоненты: поля и методы.
- •. Определение экземпляров объектов. Операция присваивания над объектами. Обращение к компонентам объекта из программы и методов. Неявный параметр Self.
- •Var a:Troom;
- •. Инициализация полей объектов.
- •Var l,w,s:real;
- •Var l,w,s:real;
- •Var l,w,s:real;
- •. Наследование.
- •Var a:tName; b:tPenson;
- •. Полиморфизм.
- •. Раннее и позднее связывание. Виртуальные методы. Конструкторы. Определение типа объекта.
- •Var I:integer; s:real;
- •Var I:integer;
- •Var a:tRoom; b:tFlat;
- •. Динамические объекты. Деструкторы.
- •Var p:pTObj;
- •Var p:pTObj;
- •Var a:tObj;
- •Использование технологии ооп. . Использование объектов при создании новых структур данных.
- •Interface
- •Implementation
- •Var next:pElement;
- •Var n:tSpisok; k:integer;p:pNum;
- •. Использование объектов при создании меню.
- •Риc. 2. 7. Библиотечные оконные формы.
- •Interface
- •Inp.Init(bx1,by1,bx2,by2,battr,bxt,byt,'');
- •Inp.Draw;
- •Inp.Draw;
- •Var w1:array[1..10] of tWin absolute p1;
- •I:integer;
- •Var I:integer;
- •Var I:integer;
- •Var I:integer;
- •Interface
- •Implementation
- •Var k:boolean;
- •If Compare(fam) then
- •Var a:tMainMenu; b:tAddMenu; c:tOpenBase;
- •1:Begin
- •Var l:integer;
- •Inp:(x1:34;y1:8;x2:46;y2:8;attr:112;xt:1;yt:1;text:'')),
- •Inp:(x1:34;y1:10;x2:46;y2:10;attr:112;xt:1;yt:1;text:'')));
- •. Использование объектов при создании движущихся изображений.
- •Var color:word;
- •Var driver,mode:integer;
Var I:integer; s:real;
Begin s:=0;
for i:=1 to n do s:=s+rooms[i].square;
square:=s;
End;
Constructor TFlat.Init(nn:integer;c:real;Var mas);
Var I:integer;
m:array[1..10] of RRoom absolute mas;
Begin n:=nn;
cost:=c;
for i:=1 to n do
rooms[i].Init(0,m[i].length,m[i].wight);
End;
Const mr:array[1..3] of RRoom=((length:3;wight:3),
(length:4;wight:4),
(length:3;wight:5));
Var a:tRoom; b:tFlat;
Begin A.Init(50,5,6);
B.Init(3,60,mr);
WriteLn(A.price);
WriteLn(B.price);
End.
В приведенном примере объекты-потомки «Комната» и «Квартира» используют метод определения стоимости объекта-родителя «Помещение», но каждый раз при определении стоимости функция определения площади вызывается для соответствующего объекта-потомка, так как эта функция является полиморфной и виртуальной.
При определении того, какой (статический или виртуальный) метод использовать при решении задачи следует иметь в виду, что:
виртуальные методы занимают больше памяти (из-за ТВМ);
вызов виртуальных методов выполняется медленнее, чем статических;
полиморфная функция не может содержать и статические и виртуальные аспекты одновременно;
списки параметров статических аспектов полиморфного метода могут различаться, а виртуальных - нет;
однако, при создании иерархий объектов использование виртуальных методов позволяет организовать более гибкое взаимодействие методов.
При необходимости программист может определить тип объекта, с которым в настоящий момент времени работает виртуальный метод. Для этого используется стандартная функция Паскаля TypeOf(TObj), которая для объектов возвращает адрес ТВМ. Сравнив этот адрес с адресом интересующего нас типа, мы определим тип объекта, с которым работает метод:
if TypeOf(Self)=TypeOf(TA) then ...
. Динамические объекты. Деструкторы.
Объектные переменные во многом подобны обычным, в частности, их можно размещать в динамической памяти. Для выделения памяти экземпляру объекта можно использовать специальный вариант функции или процедуры New.
Процедура: New(<указатель на объект>[,<имя конструктора>]);
Функция:
<указатель на объект>:= New(<тип объекта>[,<имя конструктора>])
При запросе памяти под экземпляр объекта, не содержащего виртуальных методов, указание имени конструктора не обязательно.
Для освобождения памяти при уничтожении динамического экземпляра объекта используется процедура
Dispose(<указатель на объект>,[<имя деструктора>]);
Деструктор - это специальная процедура, при описании которой служебное словоProcedure заменяется служебным словомDestructor (так же как и для конструктора, для деструктора существует рекомендованное имя -Done). Деструктор используется для определения действий, которые необходимо выполнить перед уничтожением объекта.Если динамический объект использует виртуальные методы, то использование деструктора обязательно. Обычно деструктор определяет действия по освобождению памяти, распределенной для размещения динамических полей, как статических, так и динамических объектов, но может и не содержать выполняемых операторов.
Пример 7.Динамический объект со статическим полем без деструктора.
Program ex;
Type pTObj=^TObj; {объявление указателя на объект}
TObj=Object {определение объекта}
pole:real; {статическое поле}
procedure Print; {статическая процедура печати}
constructor Init(p:real); {конструктор}
end;
Procedure TObj.Print;
Begin WriteLn('Значение поля = ',pole); end;
Constructor TObj.Init(p:real);
Begin pole:=p; end;
Var p:pTObj; {объявление переменной типа «указатель на объект»}
Begin New(p,Init(5)); {выделение памяти и инициализация поля}
p^.Print;
Dispose(p); {освобождение памяти}
End.
Пример 8.Динамический объект с динамическим полем и деструктором.
Program ex;
Type pTObj=^TObj;
TObj=Object
pPole:^real; {динамическое поле}
procedure Print;
constructor Init(p:real); {конструктор}
destructor Done; {деструктор}
end;
Procedure TObj.Print;
Begin WriteLn('Значение поля = ',pPole^); end;
Constructor TObj.Init(p:real);
Begin New(pPole); {выделение памяти под дин. поле}
pPole^:=p;
end;
Destructor TObj.Done;
Begin Dispose(pPole); {освобождение памяти}
end;