Введение в объектно-ориентированное программирование на языке Object Pascal. Соколов Е.В. - 65 стр.

UptoLike

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

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