Как и при конфликте имен, нельзя позволять компилятору делать выбор, пользуясь собственными правилами, - это противоречило бы принципам ясности и надежности. Управление ситуацией должно оставаться за автором разработки.
Для устранения неоднозначности необходим простой языковой механизм - предложение select
. Вот версия класса, в которой предпочтение при динамическом связывании сущностиclass D inherit
B
C
select f end
feature
...
end
В этом варианте предпочтение отдается версии класса
class D inherit
B
select bf end
C
feature
...
end
Синтаксически предложение select
следует за предложениями rename, undefine и redefine, если таковые имеются (выбор осуществляется после переименования и переопределения). Применение этого механизма регламентирует следующее правило:Правило выделения
Класс, наследовавший две или более различные и эффективные версии компонента дублируемого предка и не переопределивший их, должен включить одну из них в предложение select
.Механизм select
устраняет неоднозначность раз и навсегда. Потомкам класса нет необходимости (и они не должны) повторять выделение.Выделение всех компонентов
Любой конфликт переопределений должен быть разрешен посредством select
. Если, объединяя два класса, вы натолкнулись на ряд конфликтов, возможно, вы захотите, чтобы один из классов "одержал верх" (почти) в каждом из них. В частности, так происходит в ситуации, метафорично названной "брак по расчету" (вспомните,Решение задачи упрощает следующая запись, дающая возможность не перечислять все конфликтующие компоненты. Предложение inherit
класса может содержать такое описание (не более одного) родителя:SOME_PARENT
select all end
Результат очевиден: все конфликты переопределений, - точнее те из них, что останутся после обработки других select
, - разрешатся в пользуСохранение исходной версии при переопределении
(Этот раздел посвящен весьма специфичному вопросу, и при первом чтении книги его можно пропустить.)
Приступая к изучению наследования, мы познакомились с простой конструкцией
Вернемся к известному нам классу
display is
-- Показ кнопки на экране.
do
window_display
special_button_actions
end
где
Мы уже знаем, как написать
indexing
WARNING: "Это первая попытка - данная версия некорректна!"
class BUTTON inherit
WINDOW
redefine display end
WINDOW
rename display as window_display end
feature
...
end
Одна из ветвей наследования меняет имя
Этот вариант кода почти корректен, однако в нем не хватает подвыражения select
. Если, как это обычно бывает, мы хотим выбрать переопределенную версию, то запишем:indexing
note: "Это (корректная!)схема дублируемого наследования,%
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии