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

UptoLike

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

66
for i:=1 to 7 do begin
r.SetNum(i+1); r.SetDen(i+2); v2.SetComp(i, r);
end;
Test(v1, v2);
r.Destroy; v1.Destroy; v2.Destroy; WriteLn;
v1:=DynamicVector.CreateOfType(RGBColor); v1.SetDim(9);
v2:=DynamicVector.CreateOfType(RGBColor); v2.SetDim(7);
c:=RGBColor.Create;
for i:=1 to 9 do begin
c.SetRed(i/10); c.SetGreen((i+1)/10); c.SetBlue((i-1)/10);
v1.SetComp(i, c);
end;
for i:=1 to 7 do begin
c.SetRed((i+1)/10); c.SetGreen((i+2)/10); c.SetBlue((i+3)/10);
v2.SetComp(i, c);
end;
Test(v1, v2);
c.Destroy; v1.Destroy; v2.Destroy; ReadLn;
end.
Подобная же схема может быть использована и при построении
программы, демонстрирующей работу методов всех трех классов . Но
здесь возникает небольшая проблема с созданием новых объектов внут-
ри тес тирующей процедуры .
В самом деле, в примере 4.2.1 мы пользовались тем , что каждый
вектор содержит поле с информацией о типе своих компонент. Класс
Number такого поля не имеет, однако было бы странно, если бы , обладая
объектом , мы не могли узнать его тип.
И действительно, такая возможность имеется: она реализуется
методом ClassType класса TObject, от которого неявно унаследован
Number. Этот метод возвращает значение типа class of TObject, которое
может содержать ссылку на любой класс. Чтобы использовать ее для
создания объекта при помощи конструктора, введенного в некотором
классе C, можно (и нужно) выполнить приведение данной ссылки к типу
class of C (разумеется, такое приведение будет работать правильно, лишь
если ссылка на самом деле содержит адрес кл асса C или одного из его
потом ков ).
В нашем случае приведение ссылки к типу ClassNumber необх о-
димо для вызова не только конструктора CreateEqualTo, но и Create. Без
этого приведения будет использован конструктор TObject.Create, не яв-
ляющийся виртуальным и потому создающий объект класса TObject, а
не Whole, Rational, RGBColor и т. д .
Итак, вторая демонстрационная программа будет выглядеть так.
  for i:=1 to 7 do begin
    r.SetNum(i+1); r.SetDen(i+2); v2.SetComp(i, r);
  end;
  Test(v1, v2);
  r.Destroy; v1.Destroy; v2.Destroy; WriteLn;
  v1:=DynamicVector.CreateOfType(RGBColor); v1.SetDim(9);
  v2:=DynamicVector.CreateOfType(RGBColor); v2.SetDim(7);
  c:=RGBColor.Create;
  for i:=1 to 9 do begin
     c.SetRed(i/10); c.SetGreen((i+1)/10); c.SetBlue((i-1)/10);
    v1.SetComp(i, c);
  end;
  for i:=1 to 7 do begin
     c.SetRed((i+1)/10); c.SetGreen((i+2)/10); c.SetBlue((i+3)/10);
     v2.SetComp(i, c);
  end;
  Test(v1, v2);
  c.Destroy; v1.Destroy; v2.Destroy; ReadLn;
end.


          Под обная же с хем а м ожет бы т ь ис пол ь з ов ана и при пос т роении
програм м ы , д ем онс т рирующ ей работ у м етод ов в с ех т рех кл ас с ов . Н о
з д ес ь в оз никает небол ь шая пробл ем а с с оз д анием нов ы х объектов в нут -
ри т ес т ирующ ей проц ед уры .
          В с ам ом д ел е, в прим ере 4.2.1 м ы пол ь з ов ал ис ь т ем , чтокажд ы й
в ектор с од ержит пол е с информ ац ией о т ипе с в оих ком понент. Кл ас с
Number т акогопол я не им еет, од накобы л обы с т ранно, ес л и бы , обл ад ая
объектом , м ы не м огл и уз нат ь егот ип.
          И д ейс т в ит ел ь но, т акая в оз м ожнос т ь им еет с я: она реал из ует с я
м ет од ом ClassType кл ас с а TObject, от кот орого неяв но унас л ед ов ан
Number. Э тот м етод в оз в ращ ает з начение т ипа class of TObject, которое
м ожет с од ержат ь с с ы л ку на л юбой кл ас с . Ч тобы ис пол ь з ов ат ь ее д л я
с оз д ания объект а при пом ощ и конс т руктора, в в ед енного в некотором
кл ас с е C, м ожно(и нужно) в ы пол нит ь прив ед ение д анной с с ы л ки к т ипу
class of C (раз ум еет с я, т акое прив ед ение буд ет работ ат ь прав ил ь но, л ишь
ес л и с с ы л ка на с ам ом д ел е с од ержит ад рес кл ас с а C ил и од ногоиз его
потом ков ).
          В нашем с л учае прив ед ение с с ы л ки к т ипу ClassNumber необхо-
д им од л я в ы з ов а не тол ь коконс т руктора CreateEqualTo, нои Create. Без
этого прив ед ения буд ет ис пол ь з ов ан конс т руктор TObject.Create, не яв -
л яющ ийс я в ирт уал ь ны м и потом у с оз д ающ ий объект кл ас с а TObject, а
не Whole, Rational, RGBColor и т. д .
          И т ак, в торая д ем онс т рац ионная програм м а буд ет в ы гл яд ет ь т ак.

                                          66