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

UptoLike

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

53
использующие одноименные методы компонент для их (компон ент) м о-
дификации. Здесь неизменность типа и, как следствие, целостность об ъ -
екта также оч е видны .
Наконец , возможность выполнения требуемых действий метод а ми
Plus, Minus и ScalarProduct пол ностью определяется вызываемыми ими
методами класса компонент Plus, Minus и Dot, соот вет ственно. Гаранти-
ровать, что последние возвращают объект именно того класса, ссылку
на который уже содержит поле result.comptype, инициализированное
конструктором CreateEmpty, нельзя. Поэтому мы должны пров е рить, что
каждый объект result.comp[i] действительно принадлежит указанному
классу. Сделать это можно с помощью оператора is, в качестве аргумен-
та которого допускается использовать не только имя класса, но и клас-
совую ссылку:
if not(result.comp[i] is result.comptype) then ...
Единственное , что мы до сих пор не обсудили это вновь об ъ яв -
ленный метод GetCompType. Однако, его реализация тривиальна и з аклю-
чает ся в возврате значения поля comptype. Таким образом , мы пол у чаем
Пример 3.1.2. Реализация методов класса DynamicVector.
function DynamicVector.Plus(v: DynamicVector): DynamicVector;
var i: Integer;
begin
if Length(self.comp)=Length(v.comp) then begin
result:=DynamicVector.CreateEmpty(self.comptype, Length(self.comp));
for i:=0 to Length(self.comp)-1 do begin
result.comp[i]:=self.comp[i].Plus(v.comp[i]);
// приведение типа удалено
if not(result.comp[i] is result.comptype)
then raise Exception.Create('Invalid Operation');
// результат работы метода Plus должен иметь требуемый тип
end;
end
else raise Exception.Create('Invalid Operation');
end;
function DynamicVector.Minus(v: DynamicVector): DynamicVector;
var i: Integer;
begin
if Length(self.comp)=Length(v.comp) then begin
result:=DynamicVector.CreateEmpty(self.comptype, Length(self.comp));
for i:=0 to Length(self.comp)-1 do begin
result.comp[i]:=self.comp[i].Minus(v.comp[i]);
// приведение типа удалено
ис пол ь з ующ ие од ноим енны е м етод ы ком понент д л я их (ком понент ) м о-
д ификац ии. Зд ес ь неиз м еннос т ь т ипа и, как с л ед с т в ие, ц ел ос т нос т ь объ-
ект а т акже очев ид ны .
          Н аконец , в оз м ожнос т ь в ы пол нения т ребуем ы х д ейс т в ий м етод ам и
Plus, Minus и ScalarProduct пол нос т ь ю опред ел яет с я в ы з ы в аем ы м и им и
м етод ам и кл ас с а ком понент Plus, Minus и Dot, с оот в ет с т в енно. Гаранти-
ров ат ь , что пос л ед ние в оз в ращ ают объект им енно того кл ас с а, с с ы л ку
на которы й уже с од ержит пол е result.comptype, иниц иал из иров анное
конс т руктором CreateEmpty, нел ь з я. Поэтом у м ы д ол жны пров ерит ь , что
кажд ы й объект result.comp[i] д ейс т в ит ел ь но принад л ежит указ анном у
кл ас с у. С д ел ат ь этом ожнос пом ощ ь ю оператора is, в качес т в е аргум ен-
т а которогод опус кает с я ис пол ь з ов ат ь не тол ь ко им я кл ас с а, но и кл ас -
с ов ую с с ы л ку:
if not(result.comp[i] is result.comptype) then ...
        Е д инс т в енное, чтом ы д ос их пор не обс уд ил и — этов нов ь объяв -
л енны й м етод GetCompType. О д нако, егореал из ац ия т рив иал ь на и з акл ю-
чает с я в в оз в рат е з начения пол я comptype. Т аким образ ом , м ы пол учаем

Пример3.1.2. Реал из ац ия м етод ов кл ас с а DynamicVector.

function DynamicVector.Plus(v: DynamicVector): DynamicVector;
var i: Integer;
begin
  if Length(self.comp)=Length(v.comp) then begin
     result:=DynamicVector.CreateEmpty(self.comptype, Length(self.comp));
     for i:=0 to Length(self.comp)-1 do begin
       result.comp[i]:=self.comp[i].Plus(v.comp[i]);
       // приведение типа удалено
       if not(result.comp[i] is result.comptype)
          then raise Exception.Create('Invalid Operation');
       // результат работы метода Plus должен иметь требуемый тип
     end;
  end
  else raise Exception.Create('Invalid Operation');
end;
function DynamicVector.Minus(v: DynamicVector): DynamicVector;
var i: Integer;
begin
  if Length(self.comp)=Length(v.comp) then begin
    result:=DynamicVector.CreateEmpty(self.comptype, Length(self.comp));
    for i:=0 to Length(self.comp)-1 do begin
      result.comp[i]:=self.comp[i].Minus(v.comp[i]);
      // приведение типа удалено



                                           53