Разработка классов на языке Object Pascal. Соколов Е.В. - 73 стр.

UptoLike

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

73
ПРИЛОЖЕНИЕ 2. К ЛАСС N UMBER
Приведенное определение класса Number довольно сильно отл и-
чается от используемого в третьей части пособия [*].
Во-первых, он содержит три новых абстрактных метода: IsEqual,
Assign и AsString. В производных классах их реализации должны в ы -
пол нять, соответственно, сравнение двух объектов на равенство, при-
сваивание одного объекта другому и преобразование объекта к строко-
вой форме.
Во-вторых, добавлено два конструктора: Create и CreateEqualTo
для создания и клонирования объектов . Оба они объявлены виртуал ь-
ными с тем , чтобы их можно было использовать совместно с классов ы -
ми ссылками для создания объектов , тип которых неизвестен во время
разработки. Дополнительно к классу Number введено и имя ClassNumber
для ссылочного типа class of Number.
Наконец , методы Plus, Minus, Dot, Slash и конструктор Create-
EqualTo реализованы универсальным образом с использованием других
методов того же класса. Таким образом , теперь они сами представляют
собой обобщенные алгоритмы.
В качестве примера опишем более подробно работу метода Plus.
Метод ClassType, унаследованный от TObject, возвращает ссыл-
ку на класс текущего объекта (назовем его SelfClass), который завед о-
мо является потомком Number. Поэтому приведение типа ClassNum-
ber(self.ClassType) безопасно и позволяет вызвать конструктор Create-
EqualTo именно из класса SelfClass. В результате создается копия теку-
щ его объекта, к которой с помощью метода Add прибавляется объект n.
Поскольку в классе Number данный метод объяв лен виртуал ьным,
вызывается процедура, замещающая его в классе SelfClass. Таким обр а -
зом , операция сложения выполняется по правилам , определенным в реа-
лизации класса текущего объекта.
Пример П . 2 .1. Код класса Number.
unit UnitNumber;
interface
type
Number = class
public
function Plus (n: Number): Number; virtual;
function Minus (n: Number): Number; virtual;
function Dot (n: Number): Number; virtual;
                     П РИ Л О Ж Е Н И Е 2. К Л А ССNUMBER

          Прив ед енное опред ел ение кл ас с а Number д ов ол ь но с ил ь но отл и-
чает с я от ис пол ь з уем огов т рет ь ей час т и пос обия [*].
          Во-перв ы х, он с од ержит т ри нов ы х абс т ракт ны х м ет од а: IsEqual,
Assign и AsString. В произ в од ны х кл ас с ах их реал из ац ии д ол жны в ы -
пол нят ь , с оот в ет с т в енно, с рав нение д в ух объект ов на рав енс т в о, при-
с в аив ание од ногообъект а д ругом у и преобраз ов ание объект а к с т роко-
в ой форм е.
          Во-в торы х, д обав л ено д в а конс т руктора: Create и CreateEqualTo
д л я с оз д ания и кл ониров ания объектов . О ба они объяв л ены в ирт уал ь -
ны м и с т ем , чтобы их м ожнобы л оис пол ь з ов ат ь с ов м ес т нос кл ас с ов ы -
м и с с ы л кам и д л я с оз д ания объектов , т ип которы х неиз в ес т ен в о в рем я
раз работ ки. Допол нит ел ь нок кл ас с у Number в в ед енои им я ClassNumber
д л я с с ы л очногот ипа class of Number.
          Н аконец , м етод ы Plus, Minus, Dot, Slash и конс т рукт ор Create-
EqualTo реал из ов аны унив ерс ал ь ны м образ ом с ис пол ь з ов анием д ругих
м етод ов тогоже кл ас с а. Т аким образ ом , т еперь они с ам и пред с т ав л яют
с обой обобщ енны е ал горит м ы .
          В качес т в е прим ера опишем бол ее под робноработ у м етод а Plus.
          М ет од ClassType , унас л ед ов анны й от TObject, в оз в ращ ает с с ы л -
ку на кл ас с т екущ егообъект а (наз ов ем егоSelfClass), кот оры й з ав ед о-
м о яв л яет с я пот ом ком Number. Поэт ом у прив ед ение т ипа ClassNum-
ber(self.ClassType) без опас но и поз в ол яет в ы з в ат ь конс т рукт ор Create-
EqualTo им енноиз кл ас с а SelfClass. В рез ул ь т ат е с оз д ает с я копия т еку-
щ егообъект а, к которой с пом ощ ь ю м етод а Add прибав л яет с я объект n.
          Пос кол ь ку в кл ас с е Number д анны й м етод объяв л ен в ирт уал ь ны м ,
в ы з ы в ает с я проц ед ура, з ам ещ ающ ая егов кл ас с е SelfClass. Т аким обра-
з ом , операц ия с л ожения в ы пол няет с я поправ ил ам , опред ел енны м в реа-
л из ац ии кл ас с а т екущ егообъект а.

ПримерП.2.1. Код кл ас с а Number.

unit UnitNumber;
interface
type
  Number = class
  public
    function     Plus       (n: Number): Number;        virtual;
    function     Minus      (n: Number): Number;        virtual;
    function     Dot        (n: Number): Number;        virtual;



                                         73