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

UptoLike

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

41
функции Length, вводить специальное поле для хранения раз мерности
вектора не требуется.
Очевидно, что конструктор и деструктор новому классу по-преж-
нему необходимы и ничего в их объявлениях исправлять не нужно. По-
этому мы переходим сразу к реализации методов , которая претерпит
большие изменения.
5. Прежде всего нам необходимо реализ овать вновь добавленные
методы GetDim и SetDim. Как уже было отмечено, определить размер-
ность вектора очень легко: она равна длине массива comp. Поэтому мы
получаем следующий код .
Пример 2.4.1. Реализация метода GetDim.
function DynamicRVector.GetDim: Integer;
begin result:=Length(self.comp); end;
С изменением размерности дело обстоит сложнее. Во-первых, мы
должны отдельно рассматривать случаи ее увеличения и умень шения.
Во-вторых, кроме манипуляций с массивом comp необходимо управлять
и соответствующими компонентами вектора объектами класса Ra-
tional. В первом случае следует размещать в памяти новые объекты, во
втором удалять лишние, причем размещение нужно произвести после
увеличения массива, чтобы было куда записывать адреса объектов , а
удаление наоборот , до уменьшения, иначе неоткуда будет эти адреса
брать. Добаляя к сказанному защиту от некорректных (меньше нуля) и
вырожденных (равных текущей) значений размерности, мы получаем
следующее.
Пример 2.4.2. Реализация метода SetDim.
procedure DynamicRVector.SetDim(value: Integer);
var i, OldDim: Integer;
begin
// случай некорректного значения
if value<0 then raise Exception.Create('Invalid value');
// случай уменьшения размерности
if value<Length(self.comp) then begin
// удаление лишних объектов
for i:=value to Length(self.comp)-1 do self.comp[i].Destroy;
// уменьшение длины массива
SetLength(self.comp, value);
end
функц ии Length, в в од ит ь с пец иал ь ное пол е д л я хранения раз м ернос т и
в ектора не т ребует с я.
       О чев ид но, чтоконс т руктор и д ес т руктор нов ом у кл ас с у по-преж-
нем у необход им ы и ничегов их объяв л ениях ис прав л ят ь не нужно. По-
этом у м ы переход им с раз у к реал из ац ии м етод ов , которая прет ерпит
бол ь шие из м енения.
        5. Прежд е в с егонам необход им ореал из ов ат ь в нов ь д обав л енны е
м етод ы GetDim и SetDim. Как уже бы л о от м ечено, опред ел ит ь раз м ер-
нос т ь в ектора очень л егко: она рав на д л ине м ас с ив а comp. Поэтом у м ы
пол учаем с л ед ующ ий код .

Пример2.4.1. Реал из ац ия м етод а GetDim.

function DynamicRVector.GetDim: Integer;
begin result:=Length(self.comp); end;


         С из м енением раз м ернос т и д ел ообс тоит с л ожнее. Во-перв ы х, м ы
д ол жны отд ел ь но рас с м ат рив ат ь с л учаи ее ув ел ичения и ум ень шения.
Во-в торы х, кром е м анипул яц ий с м ас с ив ом comp необход им оуправ л ят ь
и с оот в ет с т в ующ им и ком понент ам и в ектора — объект ам и кл ас с а Ra-
tional. В перв ом с л учае с л ед ует раз м ещ ат ь в пам ят и нов ы е объект ы , в о
в тором — уд ал ят ь л ишние, причем раз м ещ ение нужнопроиз в ес т и пос л е
ув ел ичения м ас с ив а, чтобы бы л о куд а з апис ы в ат ь ад рес а объектов , а
уд ал ение — наоборот, д оум ень шения, иначе неот куд а буд ет эт и ад рес а
брат ь . Добал яя к с каз анном у з ащ ит у от некоррект ны х (м ень ше нул я) и
в ы рожд енны х (рав ны х т екущ ей) з начений раз м ернос т и, м ы пол учаем
с л ед ующ ее.

Пример2.4.2. Реал из ац ия м етод а SetDim.

procedure DynamicRVector.SetDim(value: Integer);
var i, OldDim: Integer;
begin
// случай некорректного значения
  if value<0 then raise Exception.Create('Invalid value');
// случай уменьшения размерности
  if value