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

UptoLike

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

26
программы из модуля UnitRational или оперировать непосредственно по-
лями записи, то теперь такой альтернативы нет : единственное , что нам
доступно это перечисленные выше открытые методы класса Rational.
Впрочем , у нас есть возможность извлекать значения числителя и
знаменателя посредством методов GetNum/GetDen, выполнять над ними
действия, дублирующие по сути работу других методов класса Rational
(т аких, как Plus, Minus, Add), и записывать результат обратно с помощью
SetNum/SetDen. Однако данный подход не может быть оправдан даже
соображениями производительности.
Как и выше , класс назовем RVector. Его интерфейс и реализация
никак не зависят от внутреннего представления типа Rational и, следов а -
тельно, ничем не будут отличаться от приведенных в предыдущей зад а-
че. Поэтому мы можем перейти сразу к четвертому пункту схемы.
4. Так как поле comp теперь представляет собой массив указате-
лей на объекты, на конструктор ложится дополнительная забота по раз -
мещению этих объектов в памяти. Естественно, при удалении вектора
необходимо произвести обратную операцию, откуда вытекает необход и -
мость в замещении унаследованного деструктора. Таким образом , от-
крытый интерфейс класса RVector д ополняется строкой
destructor Destroy; override;
5. Реализации конструктора и деструктора выглядят очень просто
и заключаются в последовательном создании и удалении всех элементов
мас сива comp. Действия, выполнявшиеся ранее конструктором класса
RVector и состоявшие в задании корректных значений полей элементов
массива comp, теперь берет на себя конструктор класса Rational.
constructor RVector.Create;
var i: Integer;
begin
inherited Create;
for i:=1 to Dim do self.comp[i]:=Rational.Create;
end;
destructor RVector.Destroy;
var i: Integer;
begin
for i:=1 to Dim do self.comp[i].Destroy;
inherited Destroy;
end;
Чтобы получить реализацию остальных методов , нам в первую
очередь след ует заменить в имеющемся коде вызовы всех подпрограмм
програм м ы из м од ул я UnitRational ил и опериров ат ь непос ред с т в еннопо-
л ям и з апис и, то т еперь т акой ал ьт ернат ив ы нет : ед инс т в енное, что нам
д ос т упно— этоперечис л енны е в ы ше от кры т ы е м етод ы кл ас с а Rational.
          Впрочем , у нас ес т ь в оз м ожнос т ь из в л екат ь з начения чис л ит ел я и
з нам енат ел я пос ред с т в ом м етод ов GetNum/GetDen, в ы пол нят ь над ним и
д ейс т в ия, д убл ирующ ие по с ут и работ у д ругих м етод ов кл ас с а Rational
(т аких, как Plus, Minus, Add), и з апис ы в ат ь рез ул ьт ат обрат нос пом ощ ь ю
SetNum/SetDen. О д нако д анны й под ход не м ожет бы т ь оправ д ан д аже
с оображениям и произ в од ит ел ь нос т и.
          Как и в ы ше, кл ас с наз ов ем RVector. Е гоинт ерфейс и реал из ац ия
никак не з ав ис ят от в нут реннегопред с т ав л ения т ипа Rational и, с л ед ов а-
т ел ь но, ничем не буд ут отл ичат ь с я от прив ед енны х в пред ы д ущ ей з ад а-
че. Поэтом у м ы м ожем перейт и с раз у к чет в ертом у пункт у с хем ы .
         4. Т ак как пол е comp т еперь пред с т ав л яет с обой м ас с ив указ ат е-
л ей на объект ы , на конс т руктор л ожит с я д опол нит ел ь ная з абот а пораз -
м ещ ению эт их объектов в пам ят и. Е с т ес т в енно, при уд ал ении в ектора
необход им опроиз в ес т и обрат ную операц ию, от куд а в ы т екает необход и-
м ос т ь в з ам ещ ении унас л ед ов анного д ес т руктора. Т аким образ ом , от -
кры т ы й инт ерфейс кл ас с а RVector д опол няет с я с т рокой
destructor Destroy; override;
         5. Реал из ац ии конс т руктора и д ес т руктора в ы гл яд ят очень прос то
и з акл ючают с я в пос л ед ов ат ел ь ном с оз д ании и уд ал ении в с ех эл ем ентов
м ас с ив а comp. Дейс т в ия, в ы пол няв шиес я ранее конс т руктором кл ас с а
RVector и с ос тояв шие в з ад ании коррект ны х з начений пол ей эл ем ентов
м ас с ив а comp, т еперь берет на с ебя конс т руктор кл ас с а Rational.

constructor RVector.Create;
var i: Integer;
begin
  inherited Create;
  for i:=1 to Dim do self.comp[i]:=Rational.Create;
end;
destructor RVector.Destroy;
var i: Integer;
begin
  for i:=1 to Dim do self.comp[i].Destroy;
  inherited Destroy;
end;


       Ч тобы пол учит ь реал из ац ию ос т ал ь ны х м етод ов , нам в перв ую
очеред ь с л ед ует з ам енит ь в им еющ ем с я код е в ы з ов ы в с ех под програм м


                                          26