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

UptoLike

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

45
к которой и добавляется r. Полученная в итоге сумма чисел
self и r возвращается в качестве результата функции. }
else result:=inherited Plus(r);
{ Если объект r не принадлежит классу PAryFraction, выполняется
обычное сложение посредством старой версии метода, возвращающей
в качестве результата объект класса Rational. }
end;
function PAryFraction.Slash(r: Rational): Rational;
var res: PAryFraction;
begin
if (r is PAryFraction) then
if ((r as PAryFraction).base=self.base)
and self.isPowerOfBase(r.GetNum) then begin
{ Дополнительно проверяется, является ли числитель r
степенью основания. }
res:=PAryFraction.CreateAs(self.GetNum, self.GetDen);
res.base:=self.base;
res.DivideBy(r); // вызов определенного выше метода DivideBy
result:=res;
end
else raise Exception.Create('Invalid operation')
else result:=inherited Slash(r);
end;
... // реализация остальных методов производится аналогично
3.4. Статическое и динамическое связывание
Попробуем теперь привести простейший пример обобщенного
алгоритма. Определим тип Matrix следующим образом :
Matrix = array[1..n,1..n] of Rational;
где n некоторая целочисленная константа, большая 1, и рассмотрим
function AddMatrix(m1, m2: Matrix): Matrix;
var i,j: Integer;
begin
for i:=1 to n do for j:=1 to n do
result[i,j]:=m1[i,j].Plus(m2[i,j]);
end;
          к которой и добавляется r. Полученная в итоге сумма чисел
          self и r возвращается в качестве результата функции. }

    else result:=inherited Plus(r);

  { Если объект r не принадлежит классу PAryFraction, выполняется
    обычное сложение посредством старой версии метода, возвращающей
    в качестве результата объект класса Rational. }

  end;

function PAryFraction.Slash(r: Rational): Rational;
  var res: PAryFraction;
  begin
    if (r is PAryFraction) then
      if ((r as PAryFraction).base=self.base)
          and self.isPowerOfBase(r.GetNum) then begin

         { Дополнительно проверяется, является ли числитель r
           степенью основания. }

         res:=PAryFraction.CreateAs(self.GetNum, self.GetDen);
         res.base:=self.base;
         res.DivideBy(r); // вызов определенного выше метода DivideBy
         result:=res;
       end
       else raise Exception.Create('Invalid operation')
    else result:=inherited Slash(r);
  end;

... // реализация остальных методов производится аналогично


              3.4. Статическо е и динамическо е связы вание

       Попробуем т еперь прив ес т и прос т ейш ий прим ер обобщенного
ал горит м а. Опред ел им т ип Matrix с л ед ующим образ ом :
                  Matrix = array[1..n,1..n] of Rational;
гд е n — некоторая цел очис л енная конс т ант а, бол ь ш ая 1, и рас с м от рим

function AddMatrix(m1, m2: Matrix): Matrix;
var i,j: Integer;
begin
  for i:=1 to n do for j:=1 to n do
     result[i,j]:=m1[i,j].Plus(m2[i,j]);
end;


                                        45