ВУЗ:
Составители:
Рубрика:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 11
- 12
- 13
- 14
- 15
- …
- следующая ›
- последняя »