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

UptoLike

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

25
Задача 2.3 вполне естественным образом продолжает рассматри-
ваемую серию. Снова требуется создать класс для представления вект о-
ров фиксированной длины с рациональными компонентами. Однако те-
перь компоненты эти должны в свою очередь быть объектами класса.
Как и ранее, для представления рациональных чисел необходимо
использовать уже существующий класс Rational, определение которого
находится в отдельном модуле UnitRational. Для решения задачи доста-
точно знать, что класс Rational унаследован от некоего абстрактного
класса Number и имеет следующий открытый интерфейс :
function Plus (n: Number): Number; // вычисление суммы
function Minus (n: Number): Number; // вычисление разности
function Dot (n: Number): Number; // вычисление произведения
function Slash (n: Number): Number; // вычисление частного
function IsEqual(n: Number): Boolean; // сравнение на равенство
procedure Add (n: Number); // прибавление
procedure Subtract (n: Number); // вычитание
procedure MultiplyBy(n: Number); // домножение
procedure DivideBy (n: Number); // деление
procedure Assign (n: Number); // присваивание
function AsString: String; // преобразование в строку
constructor Create; // конструктор по умолчанию
constructor CreateEqualTo(n: Number); // создание копии
procedure SetNum(value: Integer); // изменяет числитель
procedure SetDen(value: Integer); // изменяет знаменатель
function GetNum: Integer; // возвращает числитель
function GetDen: Integer; // возвращает знаменатель
Реализация данного класса гарантирует целостность объекта и воз-
буждение исключения в случае, когда корректное выполнение операции
невозможно (например, при делении на ноль). Конструктор Create с озда-
ет объект, представляющий нулевое число, CreateEqualTo копию з а-
данного объекта. Более подробные сведения о классе Rational приводятся
в приложении 3. Описание класса Number содержится в приложении 2.
Решение задачи снова будем осуществлять путем последователь-
ных исправлений написанного ранее кода. Причин, по которым прихо-
дится эти исправления производить, две. Во-первых, объекты в отл ичие
от записей являются указателями, что создает ряд дополнительных про-
блем , таких, например, как явное размещение в памяти и уд а ление из
нее. Во-вторых, внутренняя реализация объекта полностью скрыта от
нас , и если раньше мы могли выбирать, использовать ли готовые под -
        Задача 2.3 в пол не ес т ес т в енны м образ ом прод ол жает рас с м ат ри-
в аем ую с ерию. С нов а т ребует с я с оз д ат ь кл ас с д л я пред с т ав л ения в екто-
ров фикс иров анной д л ины с рац ионал ь ны м и ком понент ам и. О д накот е-
перь ком понент ы эт и д ол жны в с в ою очеред ь бы т ь объект ам и кл ас с а.

         Как и ранее, д л я пред с т ав л ения рац ионал ь ны х чис ел необход им о
ис пол ь з ов ат ь уже с ущ ес т в ующ ий кл ас с Rational, опред ел ение которого
наход ит с я в отд ел ь ном м од ул е UnitRational. Дл я решения з ад ачи д ос т а-
точно з нат ь , что кл ас с Rational унас л ед ов ан от некоего абс т ракт ного
кл ас с а Number и им еет с л ед ующ ий от кры т ы й инт ерфейс :

function       Plus    (n: Number): Number;          //   вычисление суммы
function       Minus (n: Number): Number;            //   вычисление разности
function       Dot     (n: Number): Number;          //   вычисление произведения
function       Slash (n: Number): Number;            //   вычисление частного
function       IsEqual(n: Number): Boolean;          //   сравнение на равенство
procedure      Add        (n: Number);               //   прибавление
procedure      Subtract (n: Number);                 //   вычитание
procedure      MultiplyBy(n: Number);                //   домножение
procedure      DivideBy (n: Number);                 //   деление
procedure      Assign     (n: Number);               //   присваивание
function       AsString: String;                     //   преобразование в строку
constructor    Create;                               //   конструктор по умолчанию
constructor    CreateEqualTo(n: Number);             //   создание копии
procedure      SetNum(value: Integer);               //   изменяет числитель
procedure      SetDen(value: Integer);               //   изменяет знаменатель
function       GetNum: Integer;                      //   возвращает числитель
function       GetDen: Integer;                      //   возвращает знаменатель


        Реал из ац ия д анногокл ас с а гарант ирует ц ел ос тнос ть объект а и в оз -
бужд ение ис кл ючения в с л учае, когд а коррект ное в ы пол нение операц ии
нев оз м ожно(наприм ер, при д ел ении на нол ь ). Конс т руктор Create с оз д а-
ет объект, пред с т ав л яющ ий нул ев ое чис л о, CreateEqualTo — копию з а-
д анногообъект а. Бол ее под робны е с в ед ения окл ас с е Rational прив од ят с я
в прил ожении 3. О пис ание кл ас с а Number с од ержит с я в прил ожении 2.
         Реш ение з ад ачи с нов а буд ем ос ущ ес т в л ят ь пут ем пос л ед ов ат ел ь -
ны х ис прав л ений напис анного ранее код а. Причин, по которы м прихо-
д ит с я эт и ис прав л ения произ в од ит ь , д в е. Во-перв ы х, объект ы в отл ичие
от з апис ей яв л яют с я указ ат ел ям и, чтос оз д ает ряд д опол нит ел ь ны х про-
бл ем , т аких, наприм ер, как яв ное раз м ещ ение в пам ят и и уд ал ение из
нее. Во-в торы х, в нут ренняя реал из ац ия объект а пол нос т ь ю с кры т а от
нас , и ес л и рань ше м ы м огл и в ы бират ь , ис пол ь з ов ат ь л и готов ы е под -


                                           25