...
end
Предложение rename следует за указанием имени родителя и предшествует любым выражениям redefine, если таковые имеются. Можно переименовать и несколько компонентов, как в случае:
class TREE [G] inherit
CELL [G]
rename item as node_item, put as put_right end
где устраняется конфликт между одноименными компонентами
Результат переименования
Убедимся, что нам понятен результат этого действия. Пусть класс
Рис. 15.13. Устранение конфликта имен
(Обратите внимание на графическое обозначение операции смены имен.) Пусть также имеются сущности трех видов:
l: LONDON; n: NEW_YORK; s: SANTA_BARBARA
Вызовы
В то же время, следующие вызовы некорректны:
[x].
[x].
При всей искусственности имен пример хорошо иллюстрирует природу конфликта имен. Хотите верьте, хотите нет, но приходилось слышать, что конфликт порождает 'глубокую семантическую проблему'. Это неправда. Конфликт имен - простая синтаксическая проблема. Если бы автор первого класса сменил имя компонента на
Смена имен и переопределение
В предыдущей лекции мы обсудили переопределение компонентов, полученных по наследству. (Помните, что переопределение эффективного компонента задает его новое определение, а для отложенного компонента задает его реализацию.) Сравнение переименования и переопределения компонентов поможет многое прояснить.
[x]. Переопределение меняет компонент, но сохраняет его имя.
[x]. Переименование меняет имя, но сохраняет компонент.
При помощи переопределения можно добиться того, чтобы одно и то же имя компонента ссылалось на фактически различные компоненты в зависимости от типа объекта, к которому оно применяется (в этом случае говорят о динамическом типе соответствующей сущности). Это - семантический механизм.
Смена имен - это синтаксический механизм, позволяющий ссылаться на один и тот же компонент, фигурирующий в разных классах под разными именами.
Иногда то и другое можно совмещать:
class SANTA_BARBARA inherit
LONDON
rename
foo as fog
redefine
fog
end
...
Если, как и раньше,
Заметьте: redefine содержит уже новое имя компонента. Это нормально, поскольку под этим именем компонент известен классу. Именно поэтому rename должно находиться выше всех остальных предложений наследования (таких, как redefine и пока неизвестные читателю export, undefine, select). После выполнения rename компонент теряет свой прежний идентификатор и становится известным под новым именем классу, его потомкам и его клиентам.
Подбор локальных имен
