Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
До сих пор мы использовали только, так называемые статические методы, адреса которых связываются с экземплярами объектов (переменными объектных типов) статически, еще во время компиляции и не изменяются до завершения работы программы.
Для описания методов в ООП (объектно-ориентированном программировании) используются традиционные для Турбо Паскаль процедуры и функции, а также особый вид процедур –конструкторы и деструкторы.
Конструкторы предназначены для создания конкретного экземпляра объекта, ведь объект –это тип данных, т.е. «шаблон», по которому можно создать множество рабочих экземпляров данных объектного типа. Зарезервированное слово constructor используется в заголовке конструктора вместо слова procedure и предписывает компилятору создать особый код пролога, с помощью которого настраивается так называемая таблица виртуальных методов.
Если в объекте нет виртуальных методов, в нем может не быть ни одного конструктора и наоборот, если хотя бы один метод описан как виртуальный (с последующим словом virtual) в состав объекта должен входить хотя бы один конструктор и обращение к конструктору должно предшествовать обращению к любому виртуальному методу.
Типичное действие, реализуемое конструктором, состоит в наполнении объектных полей конкретными значениями. следует отметить, что разные экземпляры одного и того же объекта отличаются друг от друга только содержимым объектных полей, в то время, как каждый из них использует одни и те же объектные методы.
В рассмотренной выше программе возникали определенные трудности с переброской значений параметров между методами объекта. Задача значительно упрощается, если ввести конструктор и использовать виртуальные методы.
Program DemoObgect;
Uses Graph,CRT;
Type
Ptica = object;
x,y,xa,ya,bx,by,ax,ay:integer;
vver,pole,vnis:Pointer;
Mize,Size,Lize:integer;
ch:char;
Constructor init;
Procedure Draw;
Procedure Mahi; Virtual;
Procedure Polet; Virtual;
end;
Constructor Ptica.init;
begin
xa:=100;
ya:=100;
bx:=ax;
by:=ay;
end;
Procedure Ptica.Draw;
begin
Ptica.init;
SetColor(14);
SetFillStyle(1,14);
FillEllipse(xa,ya,10,10);
Line(xa-10,ya,xa-30,ya);
Line(xa+10,ya,xa+30,ya);
Line(xa-30,ya,xa-50,ya-20);
Line(xa+30,ya,xa+50,ya-20);
Size:=ImageSize(xa-50,ya-20,xa+50,ya+20);
GetMem(vver,size);
GetImage(xa-50,ya-20,xa+50,ya+20,vver^);
ClearDevice
FillEllipse(xa,ya,10,10);
Line(xa-10,ya,xa-30,ya);
Line(xa-10,ya,xa+30,ya);
Line(xa-30,ya,xa-50,ya+20);
Line(xa+30,ya,xa+50,ya+20);
Lize:=ImageSize(xa-50,ya-20,xa+50,ya+20);
GetMem(vniz,lize);
GetImage(xa-50,ya-20,xa+50,ya+20,vniz^);
ClearDevice:
end;
Procedure Ptica.Mahi;
begin
Ptica.init;
Mize:=ImageSize(bx,by,bx+100,by+40);
GetMem(pole,mize);
GetImage(bx,by,bx+100,by+40,pole^);
PutImage(bx,by,vver^,1);
delay(70);
PutImage(bx,by,pole^,0);
PutImage(bx,by,vniz^,1);
delay(70);
PutImage(bx,by,pole^,0);
PutImage(bx,by,vniz^,1);
delay(70);
PutImage(bx,by,pole^,0);
end;
Procedure Ptica.Polet;
begin
repeat
if KeyPressed then
begin
ch:=ReadKey;
case ch of
#77:ax:=ax+10;
#75:ax:=ax-10;
#80:ay:=ay+10;
#72:ay:=ay-10;
end;
Ptica.init;
Mahi;
end;
else
begin
Ptica.init;
Mahi;
end;
until ch=#32;
end;
Var GrDriver, GrMode,alx,aly:integer;
gol:Ptica;
Begin
GrDriver:=Detect;
InitGraph (GrDriver, GrMode, 'C: |Bp|BGI');
readln;
Gol.init;
Gol.Draw;
Gol.Polet;
readln;
CloseGraph;
End.
При трансляции объекта, содержащего виртуальные методы, создается так называемая таблица виртуальных методов (ТВМ), количество элементов которой равно количеству виртуальных методов объекта. В этой таблице будут храниться адреса точек входа в каждый виртуальный метод. В нашем примере ТВМ объекта Ptica хранит два элемента –адреса методов Mahi и Polet
Необходимо отметить особо, что в качестве имен конструкторов объектов, так же как и для процедур инициализации, рекомендуется использовать идентификатор Init.
Различие между вызовом статического и динамического методами заключается в том, что в первом случае компилятору заранее известна связь объекта с методом, и он устанавливает ее на этапе компиляции. Во втором случае компилятор как бы откладывает решение до момента выполнения программы.
Применительно к статическим и динамическим методам различают термины: ранняя связь и поздняя связь.
Ранней связью называется процесс статического связывания методов с реализациями объектов.
Поздней связью называется процесс динамического связывания методов с реализациями объектов.
Кроме того, если объявляется виртуальный метод в каком-либо родительском типе, то это накладывает следующие ограничения на его дочерние типы:
- все методы дочерних типов, одноименные с виртуальными родительскими методами, так же обязаны быть виртуальными (статический метод никогда не может подавить виртуальный);
- после того, как метод стал виртуальным, его заголовок не может изменяться в объектах более низкого уровня иерархии. Заголовки всех реализаций одного и того же виртуального метода должны быть идентичными, включая число параметров и их типы. Отметим, что ограничение не относится к статическим методам – статический метод, переопределяющий другой, может иметь отличное число параметров и типы этих параметров.
- Каждый объектный тип, имеющий виртуальные методы, обязан иметь конструктор.
Дата публикования: 2015-06-12; Прочитано: 541 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!