ВУЗ:
Составители:
Рубрика:
65
// объектной модели допустимость проверяется во время компиляции
end
else raise Exception.Create('Illegal operation');
end;
{ Остальные арифметические операции и процедура Reduce
реализуются аналогично. }
Наибольший интерес здесь вызывают функция Plus и процедура
Add, а также процедура Destroy. Первым делом они осуществляют бе з -
условное приведение типа параметра n1. Эта операция безопасна, если
для вызова метода и в качестве его первого параметра всегда использу-
ется один и тот же объ ект.
В самом деле, если исполнение было передано подпрограмме,
от нос ящейся к типу Rational, значит ее адрес содержало поле некоторого
объекта. При корректно спроектированной иерархии наследования от-
сюда следует, что данный объект имеет тип Rational или производный от
него. Предполагая, что этот же объект был передан подпрограмме в ка-
честве первого параметра, мы и получаем требуемый тип для n1.
В приведенных рассуждениях корректность упоминается дважды:
применительно к иерархии наследования и вызову подпрограмм. И в
том , и в другом случае ее обеспечение полностью ложится на плечи раз -
работчика. При использовании объектной модели этих проблем просто
не возникает.
Далее для объекта n2 выполняется метод TypeNameIs, проверяю-
щий его реальный тип. Обсуждение вопроса о том , почему здесь будет
вызвана нужная версия функции, отложим до следующего параграфа.
Остальные инструкции перешли из объектной версии типа почти
без изменений. Лишь в конце функции Plus снова выполняется явное
привед ение типа, теперь уже в сторону повышения. То, что это именно
повышение, следует только из реализации функции TypeNameIs, имити-
рующей стандартный оператор is. С точки зрения компилятора типы
Number и Rational совершенно независимы, поэтому он не считает дан-
ное присваивание заведомо без опас ным.
Определим , наконец, функции-конструкторы объектов типа Ra-
tional.
Пример 4.3. Конструкторы для типа Rational.
function Create: PRational;
begin
New(result); // экземпляр записи размещается в памяти
// объектной модели допустимость проверяется во время компиляции end else raise Exception.Create('Illegal operation'); end; { Остальные арифметические операции и процедура Reduce реализуются аналогично. } Н аибол ь ш ий инт ерес з д ес ь в ы з ы в ают функция Plus и процед ура Add, а т акже процед ура Destroy. Перв ы м д ел ом они ос ущес т в л яют без - ус л ов ное прив ед ение т ипа парам ет ра n1. Э т а операция без опас на, ес л и д л я в ы з ов а м етод а и в качес т в е егоперв огопарам ет ра в с егд а ис пол ь з у- ет с я од ин и тот же объект. В с ам ом д ел е, ес л и ис пол нение бы л о перед ано под програм м е, от нос ящейс я к т ипу Rational, з начит ее ад рес с од ержал опол е некоторого объект а. При коррект но с проект иров анной иерархии нас л ед ов ания от - с юд а с л ед ует, чтод анны й объект им еет т ип Rational ил и произ в од ны й от него. Пред пол агая, чтоэ тот же объект бы л перед ан под програм м е в ка- чес т в е перв огопарам ет ра, м ы и пол учаем т ребуем ы й т ип д л я n1. В прив ед енны храс с ужд енияхкоррект нос т ь упом инает с я д в ажд ы : прим енит ел ь но к иерархии нас л ед ов ания и в ы з ов у под програм м . И в том , и в д ругом с л учае ее обес печение пол нос т ь ю л ожит с я на пл ечи раз - работ чика. При ис пол ь з ов ании объект ной м од ел и э т ихпробл ем прос то не в оз никает. Дал ее д л я объект а n2 в ы пол няет с я м етод TypeNameIs, пров еряю- щий егореал ь ны й т ип. Обс ужд ение в опрос а отом , почем у з д ес ь буд ет в ы з в ана нужная в ерс ия функции, отл ожим д ос л ед ующегопараграфа. Ос т ал ь ны е инс т рукции переш л и из объект ной в ерс ии т ипа почт и без из м енений. Л иш ь в конце функции Plus с нов а в ы пол няет с я яв ное прив ед ение т ипа, т еперь уже в с торону пов ы ш ения. Т о, чтоэ тоим енно пов ы ш ение, с л ед ует тол ь коиз реал из ации функции TypeNameIs, им ит и- рующей с т анд арт ны й оператор is. С точки з рения ком пил ятора т ипы Number и Rational с ов ерш еннонез ав ис им ы , поэ том у он не с чит ает д ан- ное прис в аив ание з ав ед ом обез опас ны м . Опред ел им , наконец, функции-конс т рукторы объектов т ипа Ra- tional. Пример 4.3. Конс т рукторы д л я т ипа Rational. function Create: PRational; begin New(result); // экземпляр записи размещается в памяти 65
Страницы
- « первая
- ‹ предыдущая
- …
- 63
- 64
- 65
- 66
- 67
- …
- следующая ›
- последняя »