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

UptoLike

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

64
procedure RGBColor.SetBlue(value: Real);
begin self.SetComp(3, value); end;
function RGBColor.GetRed: Real;
begin result:=self.GetComp(1); end;
function RGBColor.GetGreen: Real;
begin result:=self.GetComp(2); end;
function RGBColor.GetBlue: Real;
begin result:=self.GetComp(3); end;
procedure RGBColor.Clamp;
var i: Integer;
begin
for i:=1 to 3 do begin
if self.comp[i]<0 then self.comp[i]:=0;
if self.comp[i]>1 then self.comp[i]:=1;
end;
end;
Размещение классов Whole и RGBColor в модулях выполняется в
точности так же, как и в задачах 2.13.1, поэтому соответствующий код
мы привод ить не будем .
Задача 4 .2. Требуется создать программу, демонстрирующую ра-
боту с объектами классов Whole, Rational и RGBColor, а также преобр а -
зовать программу из задачи 3.1 так, чтобы она манипулировала вектор а -
ми с компонентами всех трех типов . При этом в обеих программах дей-
ствия, не зависящие от конкретного типа компонент, не должны повто-
ряться.
Решение. Выполнить требование отсутствия дублирующегося
кода можно, выделив его часть, не зависящую от типа, в отдельную
процедуру. В качестве параметра эта процедура должна принимать л и-
бо уже созданные объекты, тип и значения которых определены , либо
классовую ссылку, указывающую на тип, который необходимо протес -
тировать.
Начнем с модификации программы из задачи 3.1.
Очевидно, что конкретный тип компонент необходим лишь для
соз дания векторов и заполнения их значениями. Явное упоминание ти-
па при создании вектора v4 можно заменить значением , возвращаемым
методом GetCompType для вектора v2. В результате мы получаем сле-
дующее.
procedure RGBColor.SetBlue(value: Real);
begin self.SetComp(3, value); end;
function RGBColor.GetRed: Real;
begin result:=self.GetComp(1); end;
function RGBColor.GetGreen: Real;
begin result:=self.GetComp(2); end;
function RGBColor.GetBlue: Real;
begin result:=self.GetComp(3); end;
procedure RGBColor.Clamp;
var i: Integer;
begin
  for i:=1 to 3 do begin
     if self.comp[i]<0 then self.comp[i]:=0;
     if self.comp[i]>1 then self.comp[i]:=1;
  end;
end;


       Раз м ещ ение кл ас с ов Whole и RGBColor в м од ул ях в ы пол няет с я в
точнос т и т ак же, как и в з ад ачах 2.1–3.1, поэтом у с оот в ет с т в ующ ий код
м ы прив од ит ь не буд ем .

          Задача 4.2. Требует с я с оз д ат ь програм м у, д ем онс т рирующ ую ра-
бот у с объект ам и кл ас с ов Whole, Rational и RGBColor, а т акже преобра-
з ов ат ь програм м у из з ад ачи 3.1 т ак, чтобы она м анипул иров ал а в ектора-
м и с ком понент ам и в с ех т рех т ипов . При этом в обеих програм м ах д ей-
с т в ия, не з ав ис ящ ие от конкрет ногот ипа ком понент, не д ол жны пов то-
рят ь с я.

         Реш ение. Вы пол нит ь т ребов ание от с ут с т в ия д убл ирующ егос я
код а м ожно, в ы д ел ив его час т ь , не з ав ис ящ ую от т ипа, в от д ел ь ную
проц ед уру. В качес т в е парам ет ра эт а проц ед ура д ол жна приним ат ь л и-
бо уже с оз д анны е объект ы , т ип и з начения которы х опред ел ены , л ибо
кл ас с ов ую с с ы л ку, указ ы в ающ ую на т ип, которы й необход им о прот ес -
т иров ат ь .
         Н ачнем с м од ификац ии програм м ы из з ад ачи 3.1.
         О чев ид но, что конкрет ны й т ип ком понент необход им л ишь д л я
с оз д ания в екторов и з апол нения их з начениям и. Яв ное упом инание т и-
па при с оз д ании в ектора v4 м ожноз ам енит ь з начением , в оз в ращ аем ы м
м етод ом GetCompType д л я в ектора v2. В рез ул ь т ат е м ы пол учаем с л е-
д ующ ее.



                                        64