Введение в объектно-ориентированное программирование на языке Object Pascal. Соколов Е.В. - 70 стр.

UptoLike

Составители: 

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