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

UptoLike

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

13
зации могут быть определены позднее и притом не единственным обр а -
зом . Такая последовательность действий несколько непривычна, но га-
рантирует независимость открытого интерфейса класса от конкретной
его реализ ации. Впрочем , как показывает пункт 4, данная гарантия не
является стопроцентной .
Заметим , что в задаче 1.1 мы также могли объявить все подпро-
граммы, задав лишь имя типа IVector без конкретного определения. О д -
нако это все равно не сделало бы независимой от данного оп ределения
демонстрационную программу: предположение о том , что IVector
массив , используется в ней явным образом .
Решение. 1. Как и в задаче 1.1, назовем наш класс IVector.
2. Почти весь открытый интерфейс нового класса может быть лег-
ко получен из списка объявлений подпрограмм задачи 1.1. Для этого
достаточно вспомнить, что любому методу неявно передается один па-
раметр адрес объекта, для которого он вызван. Стало быть, во всех
объявл ениях подпрограмм библиотеки первый параметр типа IVector
необходимо удалить. В резул ь тате мы получаем следующее:
function Plus (v: IVector): IVector;
function Minus (v: IVector): IVector;
function ScalarProduct(v: IVector): Integer;
function IsEqual (v: IVector): Boolean;
procedure Add (v: IVector);
procedure Subtract(v: IVector);
procedure Assign (v: IVector);
function GetLength: Real;
function AsString: String;
Однако этих объявлений недостаточно. Нам необходимы еще и
средства чтения/записи отдельных компонент вектора, вед ь теперь не-
посредственный доступ к хранящимся в закрытых полях данным из
пользовательской программы будет невозможен. Поэтому мы добавляем
еще два метода:
function GetComp(i: Integer): Integer;
procedure SetComp(i: Integer; value: Integer);
Первый из них возвращает значение i-й компоненты вектора, т. е. ос у -
ществляет чтение, второй записывает в i-ю компоненту значение, пере-
данное через параметр value.
Размерность векторов является фиксированной и по-прежнему
может быть задана константой . К сожалению, яз ык Object Pascal не по-
зволяет сделать эту константу членом класса, поэтому она должна быть
определена вне его обычным образом :
з ац ии м огут бы т ь опред ел ены поз д нее и притом не ед инс т в енны м обра-
з ом . Т акая пос л ед ов ат ел ь нос т ь д ейс т в ий нес кол ь ко неприв ы чна, но га-
рант ирует нез ав ис им ос т ь от кры того инт ерфейс а кл ас с а от конкрет ной
его реал из ац ии. Впрочем , как показ ы в ает пункт 4, д анная гарант ия не
яв л яет с я с топроц ент ной.
         Зам ет им , что в з ад аче 1.1 м ы т акже м огл и объяв ит ь в с е под про-
грам м ы , з ад ав л ишь им я т ипа IVector без конкрет ногоопред ел ения. О д -
накоэтов с е рав ноне с д ел ал обы нез ав ис им ой от д анногоопред ел ения
д ем онс т рац ионную програм м у: пред пол ожение о том , что IVector —
м ас с ив , ис пол ь з ует с я в ней яв ны м образ ом .
       Реш ение. 1. Как и в з ад аче 1.1, наз ов ем наш кл ас с IVector.
         2. Почт и в ес ь от кры т ы й инт ерфейс нов огокл ас с а м ожет бы т ь л ег-
ко пол учен из с пис ка объяв л ений под програм м з ад ачи 1.1. Дл я этого
д ос т аточно в с пом нит ь , что л юбом у м етод у неяв но перед ает с я од ин па-
рам ет р — ад рес объект а, д л я которого он в ы з в ан. С т ал о бы т ь , в о в с ех
объяв л ениях под програм м библ иот еки перв ы й парам ет р т ипа IVector
необход им оуд ал ит ь . В рез ул ьт ат е м ы пол учаем с л ед ующ ее:
function    Plus         (v: IVector):         IVector;
function    Minus        (v: IVector):         IVector;
function    ScalarProduct(v: IVector):         Integer;
function    IsEqual      (v: IVector):         Boolean;
procedure   Add     (v: IVector);
procedure   Subtract(v: IVector);
procedure   Assign (v: IVector);
function    GetLength: Real;
function    AsString: String;
          О д нако эт их объяв л ений нед ос т аточно. Н ам необход им ы ещ е и
с ред с т в а чт ения/з апис и отд ел ь ны х ком понент в ектора, в ед ь т еперь не-
пос ред с т в енны й д ос т уп к хранящ им с я в з акры т ы х пол ях д анны м из
пол ь з ов ат ел ь с кой програм м ы буд ет нев оз м ожен. Поэтом у м ы д обав л яем
ещ е д в а м етод а:
function GetComp(i: Integer): Integer;
procedure SetComp(i: Integer; value: Integer);
Перв ы й из них в оз в ращ ает з начение i-й ком понент ы в ектора, т. е. ос у-
щ ес т в л яет чт ение, в торой з апис ы в ает в i-ю ком понент у з начение, пере-
д анное через парам ет р value.
          Раз м ернос т ь в екторов яв л яет с я фикс иров анной и по-прежнем у
м ожет бы т ь з ад ана конс т ант ой. К с ожал ению, яз ы к Object Pascal не по-
з в ол яет с д ел ат ь эт у конс т ант у чл еном кл ас с а, поэтом у она д ол жна бы т ь
опред ел ена в не егообы чны м образ ом :


                                          13