Сохранение исходной версии при переопределении
(Этот раздел посвящен весьма специфичному вопросу, и при первом чтении книги его можно пропустить.)
Приступая к изучению наследования, мы познакомились с простой конструкцией
Вернемся к известному нам классу
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: 'Это (корректная!)схема дублируемого наследования,%
% использующая оригинальную версию переопределяемого компонента'
class BUTTON inherit
WINDOW
redefine
display
select
display
end
WINDOW
rename
display as window_display
export
{NONE} window_display
end
feature
...
end
Если такая схема должна применяться к целому ряду компонентов, их можно перечислить вместе. При этом нередко возникает необходимость разрешить все конфликты именно в пользу переопределенных компонентов. В этом случае можно воспользоваться select all.
| Предложение export (см. лекцию 16) определяет статус экспорта наследуемых компонентов класса. Так, |
Для скрытия всех компонентов, полученных 'в наследство' по одной из ветвей иерархии, служит запись export {NONE} all.
Такой вариант экспорта переопределенных компонентов и скрытия исходных компонентов под новыми именами весьма распространен, но отнюдь не универсален. Нередко классу наследнику необходимо скрывать или экспортировать оба варианта (если исходная версия не нарушает инвариант класса).
Насколько полезна такая техника дублируемого наследования для сохранения исходной версии компонента при переопределении? Обычно в ней нет необходимости, так как достаточно обратиться к
Пример повышенной сложности
