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

UptoLike

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

63
деле мы ни в коем случае не должны применять данные алгоритмы к
матрицам , элементы которых действительно имеют тип Number, по-
скольку для записей такого типа указатели Plus, Add и Dot не определ е-
ны . Вместо этого следует использовать структуры , содержащие адреса
конкретных подпрограмм.
Но для того, чтобы данные адреса обрабатывались корректно, они
должны находится на тех же местах, что и в записях типа Number. Более
точно это означает, что каждая замещающая структура обязана включать
все поля типа Number, и располагаться они должны в той же последов а -
тельности и с теми же смещениями относительно начала объекта.
С учетом сказанного выше определим тип для хранения рацио-
нальных чисел :
Rational = packed record
TypeNameIs: function(TypeName: String): Boolean;
Destroy: procedure(var n: PNumber);
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);
Normalize: procedure(var r: PRational);
Reduce: procedure(var r: PRational);
num: Integer;
den: Integer;
end;
Его начало полностью повторяет структуру типа Number. К уна-
следованным полям добавляется два указателя на процедуры нормал и-
зации и с окращения и два обычных поля для числителя и знаменателя. В
объявлениях новых полей фигурирует тип PRational, определяемый ана-
логично PNumber:
type PRational = ^Rational;
Для приведенной структуры можно реализовать уже все опера-
ции, что мы и сдел аем .
Пример 4.2. Определение методов типа Rational.
procedure Normalize(var r: PRational);
begin
д ел е м ы ни в коем с л учае не д ол жны прим енят ь д анны е ал горит м ы к
м ат рицам , эл ем ент ы которы х д ейс т в ит ел ь но им еют т ип Number, по-
с кол ь ку д л я з апис ей т акогот ипа указ ат ел и Plus, Add и Dot не опред ел е-
ны . Вм ес то э того с л ед ует ис пол ь з ов ат ь с т рукт уры , с од ержащие ад рес а
конкрет ны хпод програм м .
         Н од л я того, чтобы д анны е ад рес а обрабат ы в ал ис ь коррект но, они
д ол жны наход ит с я на т ехже м ес т ах, чтои в з апис яхт ипа Number. Б ол ее
точноэ тооз начает, чтокажд ая з ам ещающая с т рукт ура обяз ана в кл ючат ь
в с е пол я т ипа Number, и рас пол агат ь с я они д ол жны в той же пос л ед ов а-
т ел ь нос т и и с т ем и же с м ещениям и от нос ит ел ь ноначал а объект а.
         С учетом с каз анного в ы ш е опред ел им т ип д л я хранения рацио-
нал ь ны хчис ел :

Rational = packed record
  TypeNameIs: function(TypeName: String): Boolean;
  Destroy:    procedure(var n: PNumber);
  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);
  Normalize: procedure(var r: PRational);
  Reduce:     procedure(var r: PRational);
  num: Integer;
  den: Integer;
end;


          Е го начал о пол нос т ь ю пов т оряет с т рукт уру т ипа Number. К уна-
с л ед ов анны м пол ям д обав л яет с я д в а указ ат ел я на процед уры норм ал и-
з ации и с окращения и д в а обы чны хпол я д л я чис л ит ел я и з нам енат ел я. В
объяв л енияхнов ы хпол ей фигурирует т ип PRational, опред ел яем ы й ана-
л огичноPNumber:
                          type PRational = ^Rational;
       Дл я прив ед енной с т рукт уры м ожно реал из ов ат ь уже в с е опера-
ции, чтом ы и с д ел аем .

Пример 4.2. Опред ел ение м етод ов т ипа Rational.

procedure Normalize(var r: PRational);
begin


                                          63