ВУЗ:
Составители:
Рубрика:
48
Объяснение данной ситуации заключается в том , что все члены
клас са по умолчанию являются статическими. Это, в частности, озна-
чает, что адреса методов вычисляются во время компиляции в завис и-
мости от формального типа объектной переменной, для которой они
вызываются.
Разумеется, в рассмотренном конкретном случае решить пробл е -
му с функцией AddMatrix можно, добавив в ее реализацию определение
и приведение типов при помощи операторов is и as. Однако набор клас-
сов , которым может принадлежать элемент матрицы , окажется при этом
фиксирован на этапе разработки и, в частности, конечен.
Избавиться от данного ограничения позволяет механизм динами-
ческого связывания методов . Его применение позволяет в полной мере
реализовать полиморфизм объектов , т. е. возможность автоматического
манипулирования объектами разных типов при помощи ссылок на баз о-
вый класс. Если для мет ода используется динамическое связывание, то
адрес конкретной подпрограммы, которую необходимо вызвать, опред е-
ляется прямо во время выполнения программы, исходя из реального ти-
па объекта. Именно этого эффекта мы и хотели добиться, создавая функ-
цию AddMatrix.
Механизм динамического связывания применим только к мет о-
дам , ссылки на поля объекта всегда определяются статически. Если про-
изводны й класс переопределяет поля базового, указывая для них новый
тип, то объекты клас са-потом ка будут содержать оба экземпляра поля и
выбор того или иного осущес т вляется во время компиляции, исходя из
формального типа используемой объектной переменной .
Для включения механизма динамического связывания по отнош е -
нию к тому или иному методу необходимо, чтобы в классе, где этот м е -
тод впервые определен, после его объявления было указано зарезерв и-
рованное слово virtual (виртуальный). Кроме того, при переопределении
данного метода во всех клас сах-наслед никах соответствующее объявле-
ние следует завершать зарезервированным словом override (замещаю -
щий ). Виртуальными могут быть объявлены любые методы, включая
конструкторы и деструкторы , следует только отм етить, что заголовки
виртуального и замещающих методов должны совпадать в точности.
На самом деле динамическое связывание может использоваться
для метода и в пределах некоторой цепочки классов , определяемой и е -
рархией наслед ования. Пусть, например, имеются классы C
1
, C
2
, ¼, C
n
, и
класс C
i
+
1
является производным от C
i
для каждого i
<
n . Пусть также все
классы C
i
содержат одинаковое объявление метода X, причем в некот о-
Объяс нение д анной с ит уации з акл ючает с я в том , что в с е чл ены
кл ас с а поум ол чанию яв л яют с я ста тиче скими. Э то, в час т нос т и, оз на-
чает, что ад рес а м етод ов в ы чис л яют с я в о в рем я ком пил яции в з ав ис и-
м ос т и от форм ал ь ного т ипа объект ной перем енной, д л я кот орой они
в ы з ы в ают с я.
Раз ум еет с я, в рас с м от ренном конкрет ном с л учае реш ит ь пробл е-
м у с функцией AddMatrix м ожно, д обав ив в ее реал из ацию опред ел ение
и прив ед ение т ипов при пом ощи операторов is и as. Од наконабор кл ас -
с ов , которы м м ожет принад л ежат ь эл ем ент м ат рицы , окажет с я при э том
фикс иров ан на э т апе раз работ ки и, в час т нос т и, конечен.
И з бав ит ь с я от д анногоограничения поз в ол яет м еханиз м дин а ми-
че ског о связыва н ия м етод ов . Е го прим енение поз в ол яет в пол ной м ере
реал из ов ат ь пол иморфизм объектов , т. е. в оз м ожнос т ь ав том ат ичес кого
м анипул иров ания объект ам и раз ны хт ипов при пом ощи с с ы л ок на баз о-
в ы й кл ас с . Е с л и д л я м етод а ис пол ь з ует с я д инам ичес кое с в яз ы в ание, то
ад рес конкрет ной под програм м ы , которую необход им ов ы з в ат ь , опред е-
л яет с я прям ов ов рем я в ы пол нения програм м ы , ис ход я из реал ь ногот и-
па объект а. И м енноэ тогоэффект а м ы и хот ел и д обит ь с я, с оз д ав ая функ-
цию AddMatrix.
М еханиз м д инам ичес кого с в яз ы в ания прим еним тол ь ко к м ето-
д ам , с с ы л ки на пол я объект а в с егд а опред ел яют с я с т ат ичес ки. Е с л и про-
из в од ны й кл ас с переопред ел яет пол я баз ов ого, указ ы в ая д л я нихнов ы й
т ип, тообъект ы кл ас с а-потом ка буд ут с од ержат ь оба экз ем пл яра пол я и
в ы бор того ил и иного ос ущес т в л яет с я в о в рем я ком пил яции, ис ход я из
форм ал ь ногот ипа ис пол ь з уем ой объект ной перем енной.
Дл я в кл ючения м еханиз м а д инам ичес когос в яз ы в ания поот нош е-
нию к том у ил и ином у м етод у необход им о, чтобы в кл ас с е, гд е э тот м е-
тод в перв ы е опред ел ен, пос л е его объяв л ения бы л о указ ано з арез ерв и-
ров анное с л ов оvirtual (виртуа л ьн ый). Кром е того, при переопред ел ении
д анногом етод а в ов с ехкл ас с ах-нас л ед никахс оот в ет с т в ующее объяв л е-
ние с л ед ует з ав ерш ат ь з арез ерв иров анны м с л ов ом override (за ме щ а ю -
щий). Виртуал ь ны м и м огут бы т ь объяв л ены л юбы е м етод ы , в кл ючая
конс т рукторы и д ес т рукторы , с л ед ует тол ь ко от м ет ит ь , что з агол ов ки
в иртуал ь ногои з ам ещающихм етод ов д ол жны с ов пад ат ь в точнос т и.
Н а с ам ом д ел е д инам ичес кое с в яз ы в ание м ожет ис пол ь з ов ат ь с я
д л я м етод а и в пред ел ахнекоторой цепочки кл ас с ов , опред ел яем ой ие-
рархией нас л ед ов ания. Пус т ь , наприм ер, им еют с я кл ас с ы C1, C2, ¼, Cn, и
кл ас с Ci + 1 яв л яет с я произ в од ны м от Ci д л я кажд огоi < n. Пус т ь т акже в с е
кл ас с ы Ci с од ержат од инаков ое объяв л ение м етод а X, причем в некото-
48
Страницы
- « первая
- ‹ предыдущая
- …
- 46
- 47
- 48
- 49
- 50
- …
- следующая ›
- последняя »
