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

UptoLike

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

73
Plus: function(n1: PNumber; n2: PNumber): PNumber;
Minus: function(n1: PNumber; n2: PNumber): PNumber;
Dot: function(n1: PNumber; n2: PNumber): PNumber;
Slash: function(n1: PNumber; 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);
CreateAs: function(n, m: Integer): PRational; // добавленные
Normalize: procedure(var r: PRational); // методы
Reduce: procedure(var r: PRational); //
end;
Rational = packed record // тип Rational
VMT: PRationalVMT;
num: Integer; // добавленные
den: Integer; // поля
end;
var TypeRational: RationalVMT; // единственный экземпляр VMT
implementation
uses SysUtils; // модуль включает поддержку исключений
function Plus(n1: PNumber; n2: PNumber): PNumber;
var _self, res: PRational;
begin
_self:=PRational(n1);
if n2.VMT.TypeNameIs(n2.VMT, 'Rational') then begin
res:=PRational(TypeRational.Create);
res.num:=_self.num*PRational(n2).den+_self.den*PRational(n2).num;
res.den:=_self.den*PRational(n2).den;
res.VMT.Normalize(res); res.VMT.Reduce(res);
result:=PNumber(res);
// по сравнению с предыдущей версией изменился синтаксис вызова
// функции TypeNameIs, конструктора, процедур Normalize и Reduce
end
else raise Exception.Create('Illegal operation');
end;
... // остальные операторы и процедуры Normalize и Reduce
// модифицируются аналогично функции Plus
function Create: PNumber;
var res: PRational;
begin
New(res);
res.VMT:=@TypeRational; // объекты ссылаются на VMT типа Rational
  Plus:         function(n1: PNumber; n2: PNumber): PNumber;
  Minus:        function(n1: PNumber; n2: PNumber): PNumber;
  Dot:          function(n1: PNumber; n2: PNumber): PNumber;
  Slash:        function(n1: PNumber; 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);
  CreateAs:     function(n, m: Integer): PRational;      // добавленные
  Normalize:    procedure(var r: PRational);             // методы
  Reduce:       procedure(var r: PRational);             //
end;

Rational = packed record // тип Rational
  VMT: PRationalVMT;
  num: Integer;      // добавленные
  den: Integer;      // поля
end;

var TypeRational: RationalVMT; // единственный экземпляр VMT

implementation
uses SysUtils; // модуль включает поддержку исключений

function Plus(n1: PNumber; n2: PNumber): PNumber;
var _self, res: PRational;
begin
  _self:=PRational(n1);
  if n2.VMT.TypeNameIs(n2.VMT, 'Rational') then begin
     res:=PRational(TypeRational.Create);
     res.num:=_self.num*PRational(n2).den+_self.den*PRational(n2).num;
     res.den:=_self.den*PRational(n2).den;
     res.VMT.Normalize(res); res.VMT.Reduce(res);
     result:=PNumber(res);
     // по сравнению с предыдущей версией изменился синтаксис вызова
     // функции TypeNameIs, конструктора, процедур Normalize и Reduce
  end
  else raise Exception.Create('Illegal operation');
end;

... // остальные операторы и процедуры Normalize и Reduce
    // модифицируются аналогично функции Plus

function Create: PNumber;
var res: PRational;
begin
  New(res);
  res.VMT:=@TypeRational; // объекты ссылаются на VMT типа Rational


                                   73