ВУЗ:
Составители:
Рубрика:
70
адресов всех виртуальных методов . Сэкономить можно, выделив проц е -
дурные указатели в отдельную, существующую в единственном экзем п-
ляре структуру, которую обычно называют таблицей виртуальных ме-
тодов (VMT — virtual method table). При таком решении объект помимо
собственных полей должен содержать лишь один указатель на соответ-
ствующую его типу VMT. Вот как в этом случае будет выглядеть модуль
UnitNumber.
Пример 4.5. Вторая реализация типа Number.
unit UnitNumber;
interface
type
PNumber = ^Number;
PNumberVMT = ^NumberVMT;
NumberVMT = packed record // таблица виртуальных методов типа Number
TypeName: String; // имя типа
Ancestor: PNumberVMT; // указатель на VMT типа-предка
TypeNameIs: function(VMT: PNumberVMT; TypeName: String): Boolean;
Create: function: PNumber; // конструктор
Destroy: procedure(var n: PNumber); // деструктор
Plus: function(n1, n2: PNumber): PNumber; //
Minus: function(n1, n2: PNumber): PNumber; //
Dot: function(n1, n2: PNumber): PNumber; //
Slash: function(n1, n2: PNumber): PNumber; // операторы
Add: procedure(var n1: PNumber; n2: PNumber); //
Subtract: procedure(var n1: PNumber; n2: PNumber); //
MultiplyBy: procedure(var n1: PNumber; n2: PNumber); //
DivideBy: procedure(var n1: PNumber; n2: PNumber); //
end;
Number = packed record // тип Number
VMT: PNumberVMT;
end;
var TypeNumber: NumberVMT; // единственный экземпляр VMT
implementation
function TypeNameIs(VMT: PNumberVMT; TypeName: String): Boolean;
begin
if TypeName=VMT.TypeName then
result:=true
ад рес ов в с ехв ирт уал ь ны хм етод ов . Сэ коном ит ь м ожно, в ы д ел ив проце- д урны е указ ат ел и в от д ел ь ную, с ущес т в ующую в ед инс т в енном э кз ем п- л яре с т рукт уру, которую обы чно наз ы в ают та бл ице й виртуа л ьн ых ме - тодов (VMT — virtual method table). При т аком реш ении объект пом им о с обс т в енны хпол ей д ол жен с од ержат ь л иш ь од ин указ ат ел ь на с оот в ет - с т в ующую егот ипу VMT. Вот как в э том с л учае буд ет в ы гл яд ет ь м од ул ь UnitNumber. Пример 4.5. Вторая реал из ация т ипа Number. unit UnitNumber; interface type PNumber = ^Number; PNumberVMT = ^NumberVMT; NumberVMT = packed record // таблица виртуальных методов типа Number TypeName: String; // имя типа Ancestor: PNumberVMT; // указатель на VMT типа-предка TypeNameIs: function(VMT: PNumberVMT; TypeName: String): Boolean; Create: function: PNumber; // конструктор Destroy: procedure(var n: PNumber); // деструктор Plus: function(n1, n2: PNumber): PNumber; // Minus: function(n1, n2: PNumber): PNumber; // Dot: function(n1, n2: PNumber): PNumber; // Slash: function(n1, n2: PNumber): PNumber; // операторы Add: procedure(var n1: PNumber; n2: PNumber); // Subtract: procedure(var n1: PNumber; n2: PNumber); // MultiplyBy: procedure(var n1: PNumber; n2: PNumber); // DivideBy: procedure(var n1: PNumber; n2: PNumber); // end; Number = packed record // тип Number VMT: PNumberVMT; end; var TypeNumber: NumberVMT; // единственный экземпляр VMT implementation function TypeNameIs(VMT: PNumberVMT; TypeName: String): Boolean; begin if TypeName=VMT.TypeName then result:=true 70
Страницы
- « первая
- ‹ предыдущая
- …
- 68
- 69
- 70
- 71
- 72
- …
- следующая ›
- последняя »