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

UptoLike

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

51
function GetCompType: ClassNumber;
function AsString: String;
constructor Create;
constructor CreateOfType(ct: ClassNumber);
destructor Destroy; override;
Заметим , что единственным способом сохранения метода вычис -
ления длины вектора было бы изменение его загол овка на
function GetLength: Number;
поскольку неопределенность типа компонент вектора означает неопре-
деленность возвращаемого значения данного метода. Но тогда к классу
Number следовало бы добавить абстрактный метод вычисления квадрат-
ного корня из числа, замещаемый в каждом его наследнике. Так как ко-
рень из рационального числа является, вообще говоря, числом вещес т -
венным, нам потребовалось бы также создать потомка класса Number
для представления вещественных чисел , а следом за ним и комплексных
(если только мы считаем , что корень из отрицательного числа существу-
ет ). Соответствующий код не слишком сложен, но весьма объемен, по-
этому реализация намеченной схемы оставляется читателю в качестве
упражнения.
3. Объявление поля comp также следует исправить, заменив Ra-
tional на Number:
comp: array of Number;
Кроме того, мы должны добавить к классу поле для хранения ссылки на
тип компонент. Назовем это поле comptype:
comptype: ClassNumber;
5. Поскольку конструкторы и деструктор уже были объявлены в
пункте 2, обр атимся к реализации методов . Как обычно, мы просто ис -
правим код , взятый из предыдущей задачи.
Кроме тривиального приведения заголовков методов в соответст-
вие с интерфейсом , изменения необходимо будет внести в те участки
кода, где производится создание новых объектов . Так, в методах Scalar-
Product, GetComp и SetDim выражение Rational.Create следует заменить
на self.comptype.Create. В результате эти методы всегда будут создавать
объекты того же типа, что и компоненты вектора. Кроме того, в методе
ScalarProduct необходимо изменить класс вспомогательной переменной
temp с Rational на Number и удалить ненужное теперь приведение ре-
зультата метода Dot к типу Rational (заметим , впрочем , что и в методе
класса DynamicRVector переменная temp могла принадлежать классу
function       GetCompType: ClassNumber;
function       AsString: String;
constructor    Create;
constructor    CreateOfType(ct: ClassNumber);
destructor     Destroy; override;


       Зам ет им , чтоед инс т в енны м с пос обом с охранения м етод а в ы чис -
л ения д л ины в ектора бы л обы из м енение егоз агол ов ка на
function GetLength: Number;
пос кол ь ку неопред ел еннос т ь т ипа ком понент в ектора оз начает неопре-
д ел еннос т ь в оз в ращ аем огоз начения д анногом етод а. Н отогд а к кл ас с у
Number с л ед ов ал обы д обав ит ь абс т ракт ны й м етод в ы чис л ения кв ад рат -
ногокорня из чис л а, з ам ещ аем ы й в кажд ом егонас л ед нике. Т ак как ко-
рень из рац ионал ь ного чис л а яв л яет с я, в ообщ е гов оря, чис л ом в ещ ес т -
в енны м , нам пот ребов ал ос ь бы т акже с оз д ат ь потом ка кл ас с а Number
д л я пред с т ав л ения в ещ ес т в енны х чис ел , а с л ед ом з а ним и ком пл екс ны х
(ес л и тол ь ком ы с чит аем , чт окорень из от риц ат ел ь ногочис л а с ущ ес т в у-
ет ). С оот в ет с т в ующ ий код не с л ишком с л ожен, но в ес ь м а объем ен, по-
этом у реал из ац ия нам еченной с хем ы ос т ав л яет с я чит ат ел ю в качес т в е
упражнения.
        3. О бъяв л ение пол я comp т акже с л ед ует ис прав ит ь , з ам енив Ra-
tional на Number:
comp: array of Number;
Кром е того, м ы д ол жны д обав ит ь к кл ас с у пол е д л я хранения с с ы л ки на
т ип ком понент. Н аз ов ем этопол е comptype:
comptype: ClassNumber;
          5. Пос кол ь ку конс т рукторы и д ес т руктор уже бы л и объяв л ены в
пункт е 2, обрат им с я к реал из ац ии м етод ов . Как обы чно, м ы прос тоис -
прав им код , в з ят ы й из пред ы д ущ ей з ад ачи.
          Кром е т рив иал ь ногоприв ед ения з агол ов ков м етод ов в с оот в ет с т -
в ие с инт ерфейс ом , из м енения необход им о буд ет в нес т и в т е учас т ки
код а, гд е произ в од ит с я с оз д ание нов ы х объектов . Т ак, в м етод ах Scalar-
Product, GetComp и SetDim в ы ражение Rational.Create с л ед ует з ам енит ь
на self.comptype.Create. В рез ул ьт ат е эт и м етод ы в с егд а буд ут с оз д ав ат ь
объект ы тогоже т ипа, чтои ком понент ы в ектора. Кром е того, в м етод е
ScalarProduct необход им о из м енит ь кл ас с в с пом огат ел ь ной перем енной
temp с Rational на Number и уд ал ит ь ненужное т еперь прив ед ение ре-
з ул ьт ат а м етод а Dot к т ипу Rational (з ам ет им , в прочем , что и в м етод е
кл ас с а DynamicRVector перем енная temp м огл а принад л ежат ь кл ас с у


                                           51