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