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

UptoLike

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

64
if r.den<0 then begin
r.num:=-r.num; r.den:=-r.den;
end;
end;
function TypeNameIs(TypeName: String): Boolean;
begin
if (TypeName='Rational') or (TypeName='Number') then result:=true
else result:=false;
{ Поскольку тип Rational является производным от Number,
все его объекты принадлежат также и типу Number. Такое
определение функции соответствует поведению оператора is. }
end;
procedure Destroy(var n: PNumber);
var _self: PRational;
begin
_self:=PRational(n); // процедура Dispose определяет размер
Dispose(_self); // освобождаемой области памяти по
// формальному типу своего параметра
end;
procedure Add(var n1: PNumber; n2: PNumber);
var _num,_den: Integer; _self: PRational;
begin
_self:=PRational(n1); // понижение типа; при использовании
// объектной модели корректность обеспечивается компилятором
if n2.TypeNameIs('Rational') then begin
_num:=_self.num*PRational(n2).den+_self.den*PRational(n2).num;
_den:=_self.den*PRational(n2).den;
_self.num:=_num; _self.den:=_den;
_self.Normalize(_self); _self.Reduce(_self);
end
else raise Exception.Create('Illegal operation');
end;
function Plus(n1: PNumber; n2: PNumber): PNumber;
var _self, res: PRational;
begin
_self:=PRational(n1);
if n2.TypeNameIs('Rational') then begin
res:=UnitRational.Create;
res.num:=_self.num*PRational(n2).den+_self.den*PRational(n2).num;
res.den:=_self.den*PRational(n2).den;
res.Normalize(res); res.Reduce(res);
result:=PNumber(res); // повышение типа; при использовании
  if r.den<0 then begin
     r.num:=-r.num; r.den:=-r.den;
  end;
end;

function TypeNameIs(TypeName: String): Boolean;
begin
  if (TypeName='Rational') or (TypeName='Number') then result:=true
                                                  else result:=false;

{ Поскольку тип Rational является производным от Number,
  все его объекты принадлежат также и типу Number. Такое
  определение функции соответствует поведению оператора is. }

end;

procedure Destroy(var n: PNumber);
var _self: PRational;
begin
  _self:=PRational(n); // процедура Dispose определяет размер
  Dispose(_self);      // освобождаемой области памяти по
                       // формальному типу своего параметра
end;

procedure Add(var n1: PNumber; n2: PNumber);
var _num,_den: Integer; _self: PRational;
begin
  _self:=PRational(n1); // понижение типа; при использовании
    // объектной модели корректность обеспечивается компилятором
  if n2.TypeNameIs('Rational') then begin
    _num:=_self.num*PRational(n2).den+_self.den*PRational(n2).num;
    _den:=_self.den*PRational(n2).den;
    _self.num:=_num; _self.den:=_den;
    _self.Normalize(_self); _self.Reduce(_self);
  end
  else raise Exception.Create('Illegal operation');
end;

function Plus(n1: PNumber; n2: PNumber): PNumber;
var _self, res: PRational;
begin
  _self:=PRational(n1);
  if n2.TypeNameIs('Rational') then begin
    res:=UnitRational.Create;
    res.num:=_self.num*PRational(n2).den+_self.den*PRational(n2).num;
    res.den:=_self.den*PRational(n2).den;
    res.Normalize(res); res.Reduce(res);
    result:=PNumber(res); // повышение типа; при использовании


                                     64