Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Виртуальные и динамические методы



До сих пор мы использовали только, так называемые статические методы, адреса которых связываются с экземплярами объектов (переменными объектных типов) статически, еще во время компиляции и не изменяются до завершения работы программы.

Для описания методов в ООП (объектно-ориентированном программировании) используются традиционные для Турбо Паскаль процедуры и функции, а также особый вид процедур –конструкторы и деструкторы.

Конструкторы предназначены для создания конкретного экземпляра объекта, ведь объект –это тип данных, т.е. «шаблон», по которому можно создать множество рабочих экземпляров данных объектного типа. Зарезервированное слово 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.009 с)...