Дублируемое наследование (repeated inheritance) возникает, когда класс является потомком другого класса более чем на одном пути наследования. При этом возникает потенциальная неоднозначность, которую и следует разрешить.
В явном виде такой вариант наследования возникает только в достаточно серьезных разработках. Если вас интересуют лишь ключевые составляющие объектной методологии, то можно сразу перейти к чтению следующей лекции.
Общие предки
Множественное наследование не запрещает, например, того, чтобы класс
Рис. 15.15. Дублируемое наследование
Если
class D inherit
A
A
...
feature
...
end
По обе стороны океана
Следующий пример позволит нам промоделировать ситуацию дублируемого наследования и изучить возникающие проблемы. Пусть класс
age: INTEGER
address: STRING
violation_count: INTEGER -- Число записанных нарушений
и методы:
pass_birthday is do age := age + 1 end
pay_fee is
-- Оплата ежегодной лицензии.
do ... end
Класс наследник,
Рассмотрим категорию людей, которым в течение года приходится водить машину в обеих странах. Нужного класса у нас еще нет, и простым решением этой проблемы кажется множественное наследование. Опишем класс
Рис. 15.16. Типы водителей
Совместное использование и репликация
Из приведенного примера вытекает основная проблема дублируемого наследования: каков смысл компонентов дублируемого потомка (
Рассмотрим компонент
Внимательно перечитайте правило о конфликте имен:
Класс, наследующий от разных родителей различные компоненты с идентичным именем, некорректен.
Компоненты
Если компонент дублируемого предка под одним и тем же именем наследуется от двух и более родителей, он становится одним компонентом дублируемого потомка. Этот случай будем называть совместным использованием компонента (sharing).
Всегда ли применяется совместное использование? Нет. Рассмотрим компоненты
Этот, да и другие примеры, свидетельствует о том, что мы не добьемся желаемого, если все компоненты дублируемого предка будем использовать совместно или наоборот реплицировать. Поэтому необходима возможность настройки каждого компонента при дублируемом наследовании.
Чтобы совместно использовать один из компонентов, достаточно под одним именем унаследовать исходную версию этого компонента от обоих родителей. Но как реализовать репликацию? Делая все
