ВУЗ:
Составители:
Рубрика:
52
Number, тип Rational был использован исключительно для наглядности).
Также лишними ок а зываются приведения типа в методах Plus и Minus.
Переходя к реализации конструкторов , обсудим прежде всего в о-
прос о корректности объекта и сохранении его целостности.
Очевидно, что на протяжении всей жизни объекта его поле comp-
type должно содержать ссылку на некоторый конкретный класс. Никако-
го разумного значения по умолчанию здесь предложить невозможно, так
как класс Number является абстрактным, а ничем более подходящим мы
не располагаем . Следовательно, конструктор Create, не принимающий
ни одного параметра, можно использовать только для переинициализ а-
ции объекта, но не для его создания «с нуля» . Внутри тела конструктора
понять, с какой целью он был вызван, можно как раз по содержимому
поля comptype: его начальное значение равно nil.
Единственным способом создания вектора становится, таким об-
разом , конструктор CreateOfType. К сожалению, установить, является ли
его параметр ссылкой на конкретный или абстрактный класс, нельзя.
Ошибка проявится лишь при вызове незамещенного абстрактного мет о-
да для некоторого объ екта-ком поненты вектора.
Конструктору CreateEmpty, используемому методами Plus и Minus,
также удобно сразу передавать тип компонент. Для этого к заголовку
данного конструктора необходимо добавить параметр типа ClassNumber.
Положим , что значение типа, передаваемое указанными мет одами при
вызове, должно быть тем же, что и у вектора, для которого они вы званы .
Заметим далее, что все компоненты одного вектора всегда обяз а -
ны иметь один и тот же тип, ссылку на который содержит поле comptype
(точнее, принадлежать наследникам класса, адресуемого этим полем ).
Кроме того, тип компонент вектора, переданного в качестве аргумента
одному из методов класса DynamicVector, должен быть таким , чтобы
результат вы полнения данного метода оказался определен.
В действительности, проверка этих условий неявно производит-
ся методами класса (или классов ), которому принадлежат компоненты
вект ора.
Процед ура SetComp, специально предназначенная для изменения
компоненты, вызывает для этой цели метод Assign данной компоненты,
передавая ему в качестве параметра присваиваемое значение. Дальней-
шее повед ение определяется реализацией указанного метода (например,
метод R a tional.Assign вызовет исключение, ес ли значение параметра не
принадлежит классу Rational или одному из его потомков ), но в любом
случае тип компоненты остается без изменения.
Аналогичным образом поступают методы Add, Subtract и Assign,
Number, т ип Rational бы л ис пол ь з ов ан ис кл ючит ел ь нод л я нагл яд нос т и).
Т акже л ишним и оказ ы в ают с я прив ед ения т ипа в м етод ах Plus и Minus.
Переход я к реал из ац ии конс т рукторов , обс уд им прежд е в с егов о-
прос окоррект нос т и объект а и с охранении егоц ел ос т нос т и.
О чев ид но, чтона протяжении в с ей жиз ни объект а егопол е comp-
type д ол жнос од ержат ь с с ы л ку на некоторы й конкрет ны й кл ас с . Н икако-
гораз ум ногоз начения поум ол чанию з д ес ь пред л ожит ь нев оз м ожно, т ак
как кл ас с Number яв л яет с я абс т ракт ны м , а ничем бол ее под ход ящ им м ы
не рас пол агаем . С л ед ов ат ел ь но, конс т руктор Create, не приним ающ ий
ни од ного парам ет ра, м ожно ис пол ь з ов ат ь тол ь ко д л я переиниц иал из а-
ц ии объект а, ноне д л я егос оз д ания «с нул я» . Внут ри т ел а конс т руктора
понят ь , с какой ц ел ь ю он бы л в ы з в ан, м ожно как раз по с од ержим ом у
пол я comptype: егоначал ь ное з начение рав ноnil.
Е д инс т в енны м с пос обом с оз д ания в ектора с т анов ит с я, т аким об-
раз ом , конс т руктор CreateOfType. К с ожал ению, ус т анов ит ь , яв л яет с я л и
его парам ет р с с ы л кой на конкрет ны й ил и абс т ракт ны й кл ас с , нел ь з я.
О шибка прояв ит с я л ишь при в ы з ов е нез ам ещ енногоабс т ракт ногом ето-
д а д л я некоторогообъект а-ком понент ы в ектора.
Конс т руктору CreateEmpty, ис пол ь з уем ом у м етод ам и Plus и Minus,
т акже уд обно с раз у перед ав ат ь т ип ком понент. Дл я этого к з агол ов ку
д анногоконс т руктора необход им од обав ит ь парам ет р т ипа ClassNumber.
Пол ожим , что з начение т ипа, перед ав аем ое указ анны м и м етод ам и при
в ы з ов е, д ол жнобы т ь т ем же, чтои у в ектора, д л я которогоони в ы з в аны .
Зам ет им д ал ее, чтов с е ком понент ы од ногов ектора в с егд а обяз а-
ны им ет ь од ин и тот же т ип, с с ы л ку на которы й с од ержит пол е comptype
(точнее, принад л ежат ь нас л ед никам кл ас с а, ад рес уем ого эт им пол ем ).
Кром е того, т ип ком понент в ектора, перед анного в качес т в е аргум ент а
од ном у из м етод ов кл ас с а DynamicVector, д ол жен бы т ь т аким , чтобы
рез ул ь т ат в ы пол нения д анногом етод а оказ ал с я опред ел ен.
В д ейс т в ит ел ь нос т и, пров ерка эт их ус л ов ий неяв нопроиз в од ит -
с я м ет од ам и кл ас с а (ил и кл ас с ов ), кот ором у принад л ежат ком понент ы
в ект ора.
Проц ед ура SetComp, с пец иал ь нопред наз наченная д л я из м енения
ком понент ы , в ы з ы в ает д л я этой ц ел и м етод Assign д анной ком понент ы ,
перед ав ая ем у в качес т в е парам ет ра прис в аив аем ое з начение. Дал ь ней-
шее пов ед ение опред ел яет с я реал из ац ией указ анногом етод а (наприм ер,
м етод Rational.Assign в ы з ов ет ис кл ючение, ес л и з начение парам ет ра не
принад л ежит кл ас с у Rational ил и од ном у из его потом ков ), нов л юбом
с л учае т ип ком понент ы ос т ает с я без из м енения.
А нал огичны м образ ом пос тупают м етод ы Add, Subtract и Assign,
52
Страницы
- « первая
- ‹ предыдущая
- …
- 50
- 51
- 52
- 53
- 54
- …
- следующая ›
- последняя »
