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

UptoLike

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

76
С помощью данного механизма мы можем строить рекурсивные
алгоритмы, подобные функции TypeNameIs. В отличие от других мет о-
дов , ее первым параметром является ссылка не на конкретный объект, а
на соответствующую ему VMT (переменные типа PNumberVMT играют
здесь роль классовых ссылок). Этого вполне достаточно для определ е-
ния имени типа, хранящ е гося в поле TypeName. Если оно совпадает со
строкой , переданной в качестве второго парамет ра, проверка завершает-
ся. В противном случае, функция вызывает свою же версию из типа,
являющегося предком по отношению к текущему, и передает ей ссылку
на соответствующую VMT. Таким образом , мы перемещаемся по иерар-
хии наслед ования в направлении вершины ; добравшись до нее и не
встретив ни одного совпадения, алгоритм возвращает «ложь».
В приведенном примере мы использовали одну и ту же подпро-
грамму для реализации методов TypeNameIs обоих классов . Вместе с
тем , рекурсивный вызов производится в ней при помощи механизма ди-
намического связывания, поэтому имеется возможность применять опи-
санный алгоритм , лишь начиная с некоторого уровня иерархии.
Хотя рассмотренная в этом параграфе схема реализации динам и-
ческого связывания позволяет сильно сэкономить память, при очень раз -
витой иерархии наследования даже этого может оказаться недостаточно.
Если в базовых классах объ является множество виртуальных методов , а
замещаются они лишь изредка, то дерево VMT разрастается до внуш и-
тельных размеров и при этом содержит явно избыточную информацию.
Решением данной проблемы может служить другой алгоритм ди-
намического связывания, последовательно просматривающий классы,
являющиеся предками текущего, на предмет наличия в них подходящего
метода. При этом отпадает необходимость хранить адреса всех методов в
каждом классе, но и поиск требуемой подпрограммы проис ходит несрав -
нимо медленнее.
В Object Pascal данный алгоритм используется для вызова мет о-
дов , объ явление которых завершается директивой dynamic.
          С пом ощь ю д анного м еханиз м а м ы м ожем с т роит ь рекурс ив ны е
ал горит м ы , под обны е функции TypeNameIs. В отл ичие от д ругихм ето-
д ов , ее перв ы м парам ет ром яв л яет с я с с ы л ка не на конкрет ны й объект, а
на с оот в ет с т в ующую ем у VMT (перем енны е т ипа PNumberVMT играют
з д ес ь рол ь кл а ссовых ссыл ок). Э того в пол не д ос т аточно д л я опред ел е-
ния им ени т ипа, хранящегос я в пол е TypeName. Е с л и онос ов пад ает с о
с т рокой, перед анной в качес т в е в торогопарам ет ра, пров ерка з ав ерш ает -
с я. В прот ив ном с л учае, функция в ы з ы в ает с в ою же в ерс ию из т ипа,
яв л яющегос я пред ком поот нош ению к т екущем у, и перед ает ей с с ы л ку
на с оот в ет с т в ующую VMT. Т аким образ ом , м ы перем ещаем с я поиерар-
хии нас л ед ов ания в направ л ении в ерш ины ; д обрав ш ис ь д о нее и не
в с т рет ив ни од ногос ов пад ения, ал горит м в оз в ращает «л ожь » .
          В прив ед енном прим ере м ы ис пол ь з ов ал и од ну и т у же под про-
грам м у д л я реал из ации м етод ов TypeNameIs обоих кл ас с ов . Вм ес т е с
т ем , рекурс ив ны й в ы з ов произ в од ит с я в ней при пом ощи м еханиз м а д и-
нам ичес когос в яз ы в ания, поэ том у им еет с я в оз м ожнос т ь прим енят ь опи-
с анны й ал горит м , л иш ь начиная с некоторогоуров ня иерархии.
             Х отя рас с м от ренная в этом параграфе с хем а реал из ации д инам и-
   чес когос в яз ы в ания поз в ол яет с ил ь нос э коном ит ь пам ят ь , при очень раз -
   в итой иерархии нас л ед ов ания д аже этогом ожет оказ ат ь с я нед ос т аточно.
   Е с л и в баз ов ы хкл ас с ахобъяв л яет с я м ножес т в ов ирт уал ь ны хм етод ов , а
   з ам ещают с я они л иш ь из ред ка, то д ерев о VMT раз рас т ает с я д о в нуш и-
   т ел ь ны храз м еров и при этом с од ержит яв ноиз бы точную инф орм ацию.
             Реш ением д анной пробл ем ы м ожет с л ужит ь д ругой ал горит м д и-
   нам ичес кого с в яз ы в ания, пос л ед ов ат ел ь но прос м ат рив ающий кл ас с ы ,
   яв л яющиес я пред кам и т екущего, на пред м ет нал ичия в нихпод ход ящего
   м етод а. При этом от пад ает необход им ос т ь хранит ь ад рес а в с ехм етод ов в
   кажд ом кл ас с е, нои поис к т ребуем ой под програм м ы проис ход ит нес рав -
   ним ом ед л еннее.
             В Object Pascal д анны й ал горит м ис пол ь з ует с я д л я в ы з ов а м ето-
   д ов , объяв л ение которы хз ав ерш ает с я д ирект ив ой dynamic.




                                             76