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

UptoLike

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

19
type
Rational = record
num: Integer;
den: Integer;
end;
function Plus (r1,r2:Rational): Rational; // вычисление суммы
function Minus(r1,r2:Rational): Rational; // вычисление разности
function Dot (r1,r2:Rational): Rational; // вычисление произведения
function Slash(r1,r2:Rational): Rational; // вычисление частного
procedure Add (var r1:Rational; r2:Rational); // прибавление
procedure Subtract (var r1:Rational; r2:Rational); // вычитание
procedure MultiplyBy(var r1:Rational; r2:Rational); // домножение
procedure DivideBy (var r1:Rational; r2:Rational); // деление
function AreEqual(r1,r2:Rational): Boolean; // сравнение на равенство
function AsString(r: Rational): String; // преобразование к строковой
// форме
Решение данной задачи следует той же схеме, что и решение з а-
дачи 2.1, поэтому мы опишем лишь его отличия от предыдущего.
1. Вместо IVector создаваемый класс назовем RVector (от Rational).
2. Очевидно, что такие свойства параметров и возвращаемых зна-
чений методов , как «быть вектором» или «быть числом», а также кол и -
чество параметров и вид подпрограммы (процедура или функция) не
зависят от типа компонент векторов . Поэтому открытый интерфейс но-
вого класса может быть получен из интерфейса класса IVector путем
внесения всего двух модификаций. Первая из них очень проста и закл ю-
чается в повсеместной замене имени класса IVector на RVector. Вторая
не столь очевидна и связана с изменением типа компонент; ее необхо-
димо произвести для всех методов , тип параметра или возвращаемого
значения которых зависит от типа компонент вектора.
Интерфейс класса IVector содержит четыре метода, удовлетворяю -
щих указанному условию: GetComp, SetComp, ScalarProduct и GetLength.
В первых двух типы , соответственно, возвращаемого значения и второго
параметра непосредственно совпадают с типом компонент, поэтому необ -
ходимо просто заменить их с Integer на Rational (тип параметра i, задаю-
щего номер компоненты, по-прежнему остается целым). В третьем воз-
вращаемое значение получается из компонент векторов последовательно-
стью операций сложения и умножения. Следовательно, мы должны убе-
диться, что данные операции не выводят за пределы типа. В нашем слу-
чае это так, поэтому здесь также требуется замена Integer на Rational.
Наконец , в четвертом в качестве значения возвращается квадратный ко-
рень из рациональног о числа. Ничего не меняя, оставляем тип Real.
type
  Rational = record
     num: Integer;
     den: Integer;
  end;
function    Plus (r1,r2:Rational): Rational; // вычисление суммы
function    Minus(r1,r2:Rational): Rational; // вычисление разности
function    Dot (r1,r2:Rational): Rational; // вычисление произведения
function    Slash(r1,r2:Rational): Rational; // вычисление частного
procedure   Add       (var r1:Rational; r2:Rational); // прибавление
procedure   Subtract (var r1:Rational; r2:Rational); // вычитание
procedure   MultiplyBy(var r1:Rational; r2:Rational); // домножение
procedure   DivideBy (var r1:Rational; r2:Rational); // деление
function    AreEqual(r1,r2:Rational): Boolean; // сравнение на равенство
function    AsString(r: Rational): String; // преобразование к строковой
                                           // форме


        Реш ение д анной з ад ачи с л ед ует той же с хем е, чтои решение з а-
д ачи 2.1, поэтом у м ы опишем л ишь егоотл ичия от пред ы д ущ его.
       1. Вм ес тоIVector с оз д ав аем ы й кл ас с наз ов ем RVector (от Rational).
          2. О чев ид но, чтот акие с в ойс т в а парам ет ров и в оз в ращ аем ы х з на-
чений м етод ов , как «бы т ь в ектором » ил и «бы т ь чис л ом » , а т акже кол и-
чес т в о парам ет ров и в ид под програм м ы (проц ед ура ил и функц ия) не
з ав ис ят от т ипа ком понент в екторов . Поэтом у от кры т ы й инт ерфейс но-
в ого кл ас с а м ожет бы т ь пол учен из инт ерфейс а кл ас с а IVector пут ем
в нес ения в с егод в ух м од ификац ий. Перв ая из них очень прос т а и з акл ю-
чает с я в пов с ем ес т ной з ам ене им ени кл ас с а IVector на RVector. Вторая
не с тол ь очев ид на и с в яз ана с из м енением т ипа ком понент ; ее необхо-
д им о произ в ес т и д л я в с ех м етод ов , т ип парам ет ра ил и в оз в ращ аем ого
з начения которы х з ав ис ит от т ипа ком понент в ектора.
          И нт ерфейс кл ас с а IVector с од ержит чет ы ре м етод а, уд ов л ет в оряю-
щ их указ анном у ус л ов ию: GetComp, SetComp, ScalarProduct и GetLength.
В перв ы х д в ух т ипы , с оот в ет с т в енно, в оз в ращ аем огоз начения и в торого
парам ет ра непос ред с тв еннос ов пад ают с т ипом ком понент, поэтом у необ-
ход им опрос тоз ам енит ь их с Integer на Rational (т ип парам ет ра i, з ад аю-
щ его ном ер ком понент ы , по-прежнем у ос т ает с я ц ел ы м ). В т рет ь ем в оз -
в ращ аем ое з начение пол учает с я из ком понент в екторов пос л ед ов ат ел ь но-
с т ь ю операц ий с л ожения и ум ножения. С л ед ов ат ел ь но, м ы д ол жны убе-
д ит ь с я, чтод анны е операц ии не в ы в од ят з а пред ел ы т ипа. В нашем с л у-
чае это т ак, поэтом у з д ес ь т акже т ребует с я з ам ена Integer на Rational.
Н аконец , в чет в ертом в качес т в е з начения в оз в ращ ает с я кв ад рат ны й ко-
рень из рац ионал ь ногочис л а. Н ичегоне м еняя, ос т ав л яем т ип Real.

                                          19