ВУЗ:
Составители:
Рубрика:
72
Для перехода к нужной подпрограмме процессор должен извлечь из
области памяти, занимаемой объектом , указатель на таблицу виртуал ь-
ных мет одов , доба вить к нему смещение, величина которого по-преж-
нему определяется на этапе ком пиляции исходя из имени метода, и счи-
тать по полученному адресу значение процедурного указателя. Таким
образом , по сравнению с предыдущей реализацией мы получаем одно
дополнительное обращение к памяти, что не так уж мало, учитывая
частоту использования методов . Тем не менее, выигрыш от экономии
памяти перевешивает, и именно эта схема применяется в Object Pascal
(как, впрочем , и в некоторых других языках) для отыскания нужных
версий подпрограмм.
Выделение всех процедурных указателей в отдельную структуру
привело к появлению еще одного способа вызова методов — путем пря-
мого обр а щения к переменной TypeNumber:
TypeNumber.ИмяМетода(Параметры)
Явно указывая таблицу виртуальных методов , мы однозначно определ я-
ем их версии и, тем самым, полностью исключаем полиморфизм. По-
этому подобные выражения разумно применять лишь для методов , не
зависящих от конкретного объекта: Create и TypeNameIs (в объектной
модели такие методы называются классовыми).
Обратимся теперь к реализации наследника — типа Rational. По-
скольку он содержит и новые поля, и новые методы, нам придется до-
полнить как определение объекта, так и структуру VMT. Код подпро-
грамм, по сравнению с версией из § 4.3, изменится очень незначительно.
Пример 4.6. Новая реализация типа Rational.
unit UnitRational;
interface
uses UnitNumber; // подключаем модуль с определением типа Number
type
PRational = ^Rational;
PRationalVMT = ^RationalVMT;
RationalVMT = packed record // VMT для типа Rational
TypeName: String;
Ancestor: PNumberVMT;
TypeNameIs: function(VMT: PNumberVMT; TypeName: String): Boolean;
Create: function: PNumber;
Destroy: procedure(var n: PNumber);
Дл я переход а к нужной под програм м е процес с ор д ол жен из в л ечь из обл ас т и пам ят и, з аним аем ой объектом , указ ат ел ь на т абл ицу в ирт уал ь - ны хм етод ов , д обав ит ь к нем у с м ещение, в ел ичина которого по-преж- нем у опред ел яет с я на э т апе ком пил яции ис ход я из им ени м етод а, и с чи- т ат ь по пол ученном у ад рес у з начение процед урного указ ат ел я. Т аким образ ом , по с рав нению с пред ы д ущей реал из ацией м ы пол учаем од но д опол нит ел ь ное обращение к пам ят и, что не т ак уж м ал о, учит ы в ая час тот у ис пол ь з ов ания м ет од ов . Т ем не м енее, в ы игры ш от э коном ии пам ят и перев еш ив ает, и им енноэ т а с хем а прим еняет с я в Object Pascal (как, в прочем , и в некоторы х д ругих яз ы ках) д л я от ы с кания нужны х в ерс ий под програм м . Вы д ел ение в с ехпроцед урны хуказ ат ел ей в от д ел ь ную с т рукт уру прив ел ок появ л ению еще од ногос пос оба в ы з ов а м етод ов — пут ем пря- м огообращения к перем енной TypeNumber: TypeNumber.ИмяМетода(Параметры) Яв ноуказ ы в ая т абл ицу в ирт уал ь ны хм етод ов , м ы од ноз начноопред ел я- ем ихв ерс ии и, т ем с ам ы м , пол нос т ь ю ис кл ючаем пол им орфиз м . По- э том у под обны е в ы ражения раз ум но прим енят ь л иш ь д л я м етод ов , не з ав ис ящихот конкрет ного объект а: Create и TypeNameIs (в объект ной м од ел и т акие м етод ы наз ы в ают с я кл а ссовыми). Обрат им с я т еперь к реал из ации нас л ед ника — т ипа Rational. По- с кол ь ку он с од ержит и нов ы е пол я, и нов ы е м етод ы , нам прид ет с я д о- пол нит ь как опред ел ение объект а, т ак и с т рукт уру VMT. Код под про- грам м , пос рав нению с в ерс ией из § 4.3, из м енит с я очень нез начит ел ь но. Пример 4.6. Н ов ая реал из ация т ипа Rational. unit UnitRational; interface uses UnitNumber; // подключаем модуль с определением типа Number type PRational = ^Rational; PRationalVMT = ^RationalVMT; RationalVMT = packed record // VMT для типа Rational TypeName: String; Ancestor: PNumberVMT; TypeNameIs: function(VMT: PNumberVMT; TypeName: String): Boolean; Create: function: PNumber; Destroy: procedure(var n: PNumber); 72
Страницы
- « первая
- ‹ предыдущая
- …
- 70
- 71
- 72
- 73
- 74
- …
- следующая ›
- последняя »