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

UptoLike

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

68
AddMatrix, вызывающая для каждого элемента первой матрицы (фор-
мально имеющего тип PNumber) м етод Plus:
result[i,j]:=m1[i,j].Plus(m1[i,j], m2[i,j]);
Компил ятор транс лирует этот вызов следующим образом .
Поле Plus стоит третьим в описании типа Number, следовательно,
его смещение от начала объекта определяется размером первых двух.
Учитывая, что запись была объявлена как упакованная (packed), т. е. ее
поля следуют друг за другом без пропусков , мы получаем величину в
два машинных слова (8 байт в 32-разрядных системах).
Таким образом , из области памяти, адресуемой элементом m1[i, j],
считывается третье по счету машинное слово и его значение интерпре-
тируется как адрес искомой подпрограммы. Какой именно тип имеет
объект m1[i, j] здесь уже неважно, главное , чтобы он содержал адрес кор-
ректной версии функции Plus в указанном месте.
Вспомним теперь , что, определяя тип Rational, мы полностью
повторили структуру записи Number, добавив новые поля в конец. Кро-
ме того, при создании нового объекта данного типа функции-кон струк-
торы присваивают всем его полям реальные адреса подпрограмм. Сле-
довательно, в нашем конкретном случае сформулированное условие
справед ливо и вызовы методов приводят к исполнению желаемого кода
(см. рис . 4.1).
Теперь становится понятно, что подразумевалось под корректно
спрое к тированной иерархией наследования. Каждый тип-наслед ник дол -
жен определяться как упакованная запись (packed record) и аккурат но
повторять объявления всех полей своего типа-пред ка. Если метод не яв-
ляется абстрактным, то в определения функций-конструкторов следует
включать инициализацию соответствующего ему процедурного указате-
ля. При этом совсем не обязательно для каждого такого метода заново
создавать реализующую подпрограмму. Если версия из типа-пред ка все
еще подходит, вполне можно использовать ее адрес повторно.
Перечисленные действия гарантируют нормальную работу при-
ложения при условии, что все выполняемые программистом приведения
типа являются допустимыми. Здесь ключевую роль играет функция про-
верки типа (в нашем случае TypeNameIs), аналогичная оператору is.
В рассмотренном примере мы неоднократно пользовались безусловным
приведением , поскольку именно таковым оно является в объектной вер-
сии программы из предыдущей части. Повсеместное добавление пров е -
рок делает работу приложения более предсказуемой , но и замедляет его
выполнение.
AddMatrix, в ы з ы в ающая д л я кажд ого эл ем ент а перв ой м ат рицы (фор-
м ал ь ноим еющегот ип PNumber) м етод Plus:
               result[i,j]:=m1[i,j].Plus(m1[i,j], m2[i,j]);
Ком пил ятор т ранс л ирует э тот в ы з ов с л ед ующим образ ом .
          Пол е Plus с тоит т рет ь им в опис ании т ипа Number, с л ед ов ат ел ь но,
его с м ещение от начал а объект а опред ел яет с я раз м ером перв ы х д в ух.
Учит ы в ая, чтоз апис ь бы л а объяв л ена как упаков анная (packed), т. е. ее
пол я с л ед уют д руг з а д ругом без пропус ков , м ы пол учаем в ел ичину в
д в а м аш инны хс л ов а (8 байт в 32-раз ряд ны хс ис т ем ах).
          Т аким образ ом , из обл ас т и пам ят и, ад рес уем ой эл ем ент ом m1[i, j],
с чит ы в ает с я т рет ь е пос чет у м аш инное с л ов о и егоз начение инт ерпре-
т ирует с я как ад рес ис ком ой под програм м ы . Какой им енно т ип им еет
объект m1[i, j] з д ес ь уже нев ажно, гл ав ное, чтобы он с од ержал ад рес кор-
рект ной в ерс ии функции Plus в указ анном м ес т е.
          Вс пом ним т еперь , что, опред ел яя т ип Rational, м ы пол нос т ь ю
пов торил и с т рукт уру з апис и Number, д обав ив нов ы е пол я в конец. Кро-
м е того, при с оз д ании нов огообъект а д анногот ипа функции-конс т рук-
торы прис в аив ают в с ем егопол ям реал ь ны е ад рес а под програм м . Сл е-
д ов ат ел ь но, в наш ем конкрет ном с л учае с форм ул иров анное ус л ов ие
с прав ед л ив ои в ы з ов ы м етод ов прив од ят к ис пол нению жел аем огокод а
(с м . рис . 4.1).
            Т еперь с т анов ит с я понят но, чтопод раз ум ев ал ос ь под коррект но
с проект иров анной иерархией нас л ед ов ания. Кажд ы й т ип-нас л ед ник д ол -
жен опред ел ять с я как упаков анная з апис ь (packed record) и аккурат но
пов торять объяв л ения в с ехпол ей с в оегот ипа-пред ка. Е с л и м етод не яв -
л яет с я абс т ракт ны м , то в опред ел ения функций-конс т рукторов с л ед ует
в кл ючать инициал из ацию с оот в ет с т в ующего ем у процед урного указ ат е-
л я. При этом с ов с ем не обяз ател ь но д л я кажд ого т акого м етод а з анов о
с оз д ав ать реал из ующую под програм м у. Е с л и в ерс ия из т ипа-пред ка в с е
еще под ход ит, в пол не м ожноис пол ь з ов ать ее ад рес пов торно.
          Перечис л енны е д ейс т в ия гарант ируют норм ал ь ную работ у при-
л ожения при ус л ов ии, чтов с е в ы пол няем ы е програм м ис том прив ед ения
т ипа яв л яют с я д опус т им ы м и. Зд ес ь кл ючев ую рол ь играет функция про-
в ерки т ипа (в наш ем с л учае — TypeNameIs), анал огичная оператору is.
В рас с м от ренном прим ере м ы неод нократ нопол ь з ов ал ис ь без ус л ов ны м
прив ед ением , пос кол ь ку им еннот аков ы м онояв л яет с я в объект ной в ер-
с ии програм м ы из пред ы д ущей час т и. Пов с ем ес т ное д обав л ение пров е-
рок д ел ает работ у прил ожения бол ее пред с каз уем ой, нои з ам ед л яет его
в ы пол нение.


                                          68