4.4. Компоновка и наследование

Предыдущая  Содержание  Следующая V*D*V

move() не компонуется динамически и не использует динамически скомпонованный метод для выполнения своей работы. Хотя можно передать в move() и точки, и окружности, на самом деле это не полиморфная функция: move() не выполняет разные действия для разных видов объектов, она всегда добавляет аргументы к координатам, независимо от того, что ещё может быть присоединено к координатам.

Ситуация отличается для динамически компонуемого метода, подобного draw(). Давайте снова посмотрим на предыдущую картинку, на этот раз с описаниями типов, показанных в явном виде:

 

OOC_Linkage_and_Inheritance

 

При повышающем приведении от окружности к точке мы не изменяем состояние окружности, то есть даже хотя мы смотрим на struct Circle представления окружности так, как если бы это была struct Point, мы не изменяем её содержимое. Следовательно, окружность, рассматриваемая как точка, все ещё имеет Circle в качестве описания типа, так как указатель на его компонент .class не изменился. draw() является селекторной функцией, то есть она будет принимать любой аргумент, переданный как self, дойдёт до описания типа, обозначенном .class, и вызовет метод рисования, хранящийся там.

Подкласс наследует статически скомпонованные методы суперкласса — эти методы действуют на те части объекта подкласса, который уже присутствуют в суперклассе объекта. Подкласс может выбрать подставить свои собственные методы вместо динамически скомпонованных методов суперкласса. Если наследуются, то есть не перезаписаны, динамически связанные методы суперкласса будут функционировать так же, как статически скомпонованные методы и изменять только часть суперкласса объекта подкласса. Если перезаписаны, собственная версия динамически скомпонованного метода подкласса имеет доступ к полному представлению объекта подкласса, то есть для окружности draw() будет вызывать Circle_draw(), которая может учесть радиус при рисовании круга.

 

Предыдущая  Содержание  Следующая