ВУЗ:
Составители:
Рубрика:
42
// случай увеличения размерности
else if value>Length(self.comp) then begin
// OldDim – индекс первого из вновь добавленных элементов
OldDim:=Length(self.comp);
// увеличение длины массива
SetLength(self.comp, value);
// размещение в памяти новых компонент
for i:=OldDim to value-1 do self.comp[i]:=Rational.Create;
end;
// вырожденный случай value=Length(self.comp)
// исключен последним условием
end;
Таким образом , процедура SetDim фактически берет на себя функ-
ции и конструктора, и деструктора. Поэтому их код становится значи-
тельно проще.
Пример 2.4.3. Реализация конструктора Create и деструктора.
constructor DynamicRVector.Create;
begin
inherited Create; self.SetDim(0);
end;
destructor DynamicRVector.Destroy;
begin
self.SetDim(0); inherited Destroy;
end;
Быть может, кажется несколько странным, что конструктор и д е -
структор выполняют практически одни и те же действия. Однако, учи-
тывая отсутствие у конструктора параметра, способного принять вел и-
чину размерности вектора, такое его поведение представляется наиболее
естественным.
Дальнейшие модификации оказываются весьма однотипными.
Во-первых, во всех циклах необходимо исправить границы изме-
нения параметра, приведя их в соответствие с допустимым диапазоном
и н дексов массива comp. Аналогичные исправления следует внести в код
методов GetComp и SetComp, где также проверяется корректность ин-
декса. При этом , вычитая из значения параметра единицу, мы легко м о-
жем обеспечить трансляцию диапазона [0, GetDim-1] в более привычный
пользователю [1, GetDim] (тем самым, мы получаем еще один пример
полезности концепции сокрытия реализации).
// случай увеличения размерности
else if value>Length(self.comp) then begin
// OldDim – индекс первого из вновь добавленных элементов
OldDim:=Length(self.comp);
// увеличение длины массива
SetLength(self.comp, value);
// размещение в памяти новых компонент
for i:=OldDim to value-1 do self.comp[i]:=Rational.Create;
end;
// вырожденный случай value=Length(self.comp)
// исключен последним условием
end;
Таким образ ом , проц ед ура SetDim факт ичес ки берет на с ебя функ-
ц ии и конс т руктора, и д ес т руктора. Поэтом у их код с т анов ит с я з начи-
т ел ь нопрощ е.
Пример2.4.3. Реал из ац ия конс т руктора Create и д ес т руктора.
constructor DynamicRVector.Create;
begin
inherited Create; self.SetDim(0);
end;
destructor DynamicRVector.Destroy;
begin
self.SetDim(0); inherited Destroy;
end;
Бы т ь м ожет, кажет с я нес кол ь кос т ранны м , чтоконс т руктор и д е-
с т руктор в ы пол няют практ ичес ки од ни и т е же д ейс т в ия. О д нако, учи-
т ы в ая от с ут с т в ие у конс т руктора парам ет ра, с пос обного принят ь в ел и-
чину раз м ернос т и в ектора, т акое егопов ед ение пред с т ав л яет с я наибол ее
ес т ес т в енны м .
Дал ь нейшие м од ификац ии оказ ы в ают с я в ес ь м а од нот ипны м и.
Во-перв ы х, в ов с ех ц икл ах необход им оис прав ит ь границ ы из м е-
нения парам ет ра, прив ед я их в с оот в ет с т в ие с д опус т им ы м д иапаз оном
инд екс ов м ас с ив а comp. А нал огичны е ис прав л ения с л ед ует в нес т и в код
м етод ов GetComp и SetComp, гд е т акже пров еряет с я коррект нос т ь ин-
д екс а. При этом , в ы чит ая из з начения парам ет ра ед иниц у, м ы л егком о-
жем обес печит ь т ранс л яц ию д иапаз она [0, GetDim-1] в бол ее прив ы чны й
пол ь з ов ат ел ю [1, GetDim] (т ем с ам ы м , м ы пол учаем ещ е од ин прим ер
пол ез нос т и конц епц ии с окры т ия реал из ац ии).
42
Страницы
- « первая
- ‹ предыдущая
- …
- 40
- 41
- 42
- 43
- 44
- …
- следующая ›
- последняя »
