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

UptoLike

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

46
Эта функция складывает матрицы m1 и m2, вызывая для каждого
элемента первой матрицы метод Plus и передавая ему в качестве аргу-
мента соответствующий элемент второй матрицы . В результате получа-
ется матрица, с одержащая ссылки на объекты, созданные в процессе
работы методов Plus.
Мы знаем , что хотя формально элементы матриц принадлежат
классу Rational, в действительности они могут содержать ссылки и на
объекты любого другого класса, производного от Rational, например,
PAryFraction. Если теперь при вызове метода Plus его версия также будет
выбираться исходя из реального, а не формального, типа элемента мат-
рицы , то мы получим обобщенный алгоритм: результатом сложения
обычных рациональных чисел будет рациональное число, p-ичных дро-
бей p-ичная дробь и т . д .
Посмотрим , как именно обстоит дело.
Пример 3.4. Программа, демонстрирующая работу обобщенного алго-
ритма.
program TestAlgoritm;
{$APPTYPE CONSOLE}
uses
UnitRational, // необходим для объявления типа Matrix
UnitPAryFraction; // необходим для создания реальных объектов
const n = 3;
type Matrix = array[1..n,1..n] of Rational;
function AddMatrix(m1, m2: Matrix): Matrix;
... // здесь находится тело функции, приведенное выше
procedure WriteMatrix(m: Matrix);
var i,j:Integer;
begin
for i:=1 to n do begin
for j:=1 to n do begin
Write(m[i,j].GetNum,'/', m[i,j].GetDen);
if (m[i,j] is PAryFraction) then Write(' (PAryFraction), ')
else Write(' (Rational), ');
end; // вместе со значением каждого элемента выводится
WriteLn; // информация о его типе: Rational или PAryFraction
end;
WriteLn;
end;
         Э т а функция с кл ад ы в ает м ат рицы m1 и m2, в ы з ы в ая д л я кажд ого
эл ем ент а перв ой м ат рицы м етод Plus и перед ав ая ем у в качес т в е аргу-
м ент а с оот в ет с т в ующий эл ем ент в торой м ат рицы . В рез ул ь т ат е пол уча-
ет с я м ат рица, с од ержащая с с ы л ки на объект ы , с оз д анны е в процес с е
работ ы м етод ов Plus.
         М ы з наем , что хотя форм ал ь но эл ем ент ы м ат риц принад л ежат
кл ас с у Rational, в д ейс т в ит ел ь нос т и они м огут с од ержат ь с с ы л ки и на
объект ы л юбого д ругого кл ас с а, произ в од ного от Rational, наприм ер,
PAryFraction. Е с л и т еперь при в ы з ов е м етод а Plus егов ерс ия т акже буд ет
в ы бират ь с я ис ход я из реал ь ного, а не форм ал ь ного, т ипа эл ем ент а м ат -
рицы , то м ы пол учим обобщенны й ал горит м : рез ул ь т атом с л ожения
обы чны храционал ь ны хчис ел буд ет рационал ь ное чис л о, p-ичны хд ро-
бей — p-ичная д робь и т. д .
         Пос м от рим , как им еннообс тоит д ел о.

Пример 3.4. Програм м а, д ем онс т рирующая работ у обобщенного ал го-
рит м а.

program TestAlgoritm;
{$APPTYPE CONSOLE}
uses
  UnitRational,     // необходим для объявления типа Matrix
  UnitPAryFraction; // необходим для создания реальных объектов

const n = 3;
type Matrix = array[1..n,1..n] of Rational;

function AddMatrix(m1, m2: Matrix): Matrix;
... // здесь находится тело функции, приведенное выше

procedure WriteMatrix(m: Matrix);
var i,j:Integer;
begin
  for i:=1 to n do begin
     for j:=1 to n do begin
       Write(m[i,j].GetNum,'/', m[i,j].GetDen);
       if (m[i,j] is PAryFraction) then Write(' (PAryFraction), ')
                                   else Write(' (Rational), ');
     end;      // вместе со значением каждого элемента выводится
     WriteLn; // информация о его типе: Rational или PAryFraction
  end;
  WriteLn;
end;




                                         46