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

UptoLike

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

50
Задача 3 . 1 . Требуется разработать класс, объекты которого пред -
ставляют векторы произвольной размерности. Класс должен содержать
открытые методы, выпол няющие те же операции, что и под програм мы
библиотеки из задачи 1.1, за искл ючением определения длины вектора.
При этом компоненты векторов могут принадлежать любому фиксиро-
ванному классу, производному от Number.
Как обычно, требуется поместить полученный класс в отдельный
модуль и создать программу, использующую данный модуль и демонс т-
рирующую работу с объектами класса.
Решение. 1. Новый класс естественно назвать DynamicVector.
2. Открытый интерфейс этого класса получается из интерфейса
класса DynamicRVector очень легко: путем замены всех идентификаторов
Rational на Number и DynamicRVector на DynamicVector. Появится, впро-
чем , и кое - что новое : объект класса содержит сведения о типе его ком по-
нент и у пользователя должна быть возможность эти данные узнавать и
модифицировать. Однако изменение типа компонент уже существующ е-
го вектора вряд ли необходимо. Поэтому вместо обычной пары методов
для чтения/записи мы добавим к классу метод GetCompType, воз вращаю-
щий требуемую информацию, и конструктор CreateOfType, позволяющий
определять ее при создании или переинициализации объ е к та.
По условию задачи компоненты вектора могут принадлежать л ю-
бому классу, производному от Number. Следовательно, тип возвращае-
мого значения метода GetCompType и единственный параметр конструк-
тора CreateOfType должны иметь тип «ссылка на класс Number» , (он уже
определен в модуле UnitNumber и называется ClassNumber). Итак, мы
получаем
Пример 3.1.1. Открытый интерфейс класса DynamicVector.
function Plus (v: DynamicVector): DynamicVector;
function Minus (v: DynamicVector): DynamicVector;
function ScalarProduct(v: DynamicVector): Number;
function IsEqual (v: DynamicVector): Boolean;
procedure Add (v: DynamicVector);
procedure Subtract(v: DynamicVector);
procedure Assign (v: DynamicVector);
function GetComp(i: Integer): Number;
procedure SetComp(i: Integer; value: Number);
function GetDim: Integer;
procedure SetDim(value: Integer);
          Задача 3.1. Требует с я раз работ ат ь кл ас с , объект ы которогопред -
с т ав л яют в екторы произ в ол ь ной раз м ернос т и. Кл ас с д ол жен с од ержат ь
от кры т ы е м етод ы , в ы пол няющ ие т е же операц ии, что и под програм м ы
библ иот еки из з ад ачи 1.1, з а ис кл ючением опред ел ения д л ины в ектора.
При этом ком понент ы в ект оров м огут принад л ежат ь л юбом у фикс иро-
в анном у кл ас с у, произ в од ном у от Number.
          Как обы чно, т ребует с я пом ес т ит ь пол ученны й кл ас с в отд ел ь ны й
м од ул ь и с оз д ат ь програм м у, ис пол ь з ующ ую д анны й м од ул ь и д ем онс т -
рирующ ую работ у с объект ам и кл ас с а.

       Реш ение. 1. Н ов ы й кл ас с ес т ес т в енноназ в ат ь DynamicVector .
         2. О т кры т ы й инт ерфейс эт ого кл ас с а пол учает с я из инт ерфейс а
кл ас с а DynamicRVector очень л егко: пут ем з ам ены в с ех ид ент ификаторов
Rational на Number и DynamicRVector на DynamicVector . Появ ит с я, в про-
чем , и кое-чтонов ое: объект кл ас с а с од ержит с в ед ения от ипе егоком по-
нент и у пол ь з ов ат ел я д ол жна бы т ь в оз м ожнос т ь эт и д анны е уз нав ат ь и
м од ифиц иров ат ь . О д накоиз м енение т ипа ком понент уже с ущ ес т в ующ е-
гов ектора в ряд л и необход им о. Поэтом у в м ес тообы чной пары м етод ов
д л я чт ения/з апис и м ы д обав им к кл ас с у м етод GetCompType, в оз в ращ аю-
щ ий т ребуем ую информ ац ию, и конс т руктор CreateOfType, поз в ол яющ ий
опред ел ят ь ее при с оз д ании ил и переиниц иал из ац ии объект а.
         Поус л ов ию з ад ачи ком понент ы в ектора м огут принад л ежат ь л ю-
бом у кл ас с у, произ в од ном у от Number. С л ед ов ат ел ь но, т ип в оз в ращ ае-
м огоз начения м етод а GetCompType и ед инс т в енны й парам ет р конс т рук-
тора CreateOfType д ол жны им ет ь т ип «с с ы л ка на кл ас с Number» , (он уже
опред ел ен в м од ул е UnitNumber и наз ы в ает с я ClassNumber). И т ак, м ы
пол учаем

Пример3.1.1. О т кры т ы й инт ерфейс кл ас с а DynamicVector.

function       Plus         (v: DynamicVector): DynamicVector;
function       Minus        (v: DynamicVector): DynamicVector;
function       ScalarProduct(v: DynamicVector): Number;
function       IsEqual      (v: DynamicVector): Boolean;
procedure      Add     (v: DynamicVector);
procedure      Subtract(v: DynamicVector);
procedure      Assign (v: DynamicVector);
function       GetComp(i: Integer): Number;
procedure      SetComp(i: Integer; value: Number);
function       GetDim: Integer;
procedure      SetDim(value: Integer);



                                          50