Книга: Основы объектно-ориентированного программирования
Правило переименования
Правило переименования
В этом разделе мы не введем никаких новых понятий, а лишь точнее сформулируем известные правила и приведем пример, призванный пояснить сказанное.
Начнем с запрета возникновения конфликта имен:
Определение: финальное имя
Финальным именем компонента класса является:
[x]. Для непосредственного компонента (объявленного в самом классе) - имя, под которым он объявлен.
[x]. Для наследуемого компонента без переименования - финальное имя компонента (рекурсивно) в том родительском классе, от которого оно унаследовано.
[x]. Для переименованного компонента - имя, полученное при переименовании.
Правило одного имени
Разные эффективные компоненты одного класса не могут иметь одно и то же финальное имя.
Конфликт имен происходит в том случае, когда два разных по сути компонента, оба эффективные (реализованные), имеют одно финальное имя. Такой конфликт делает класс некорректным, однако ситуацию легко исправить, добавив надлежащее предложение переименования.
Ключевым в тексте правила является слово "разные". Если под одним именем мы наследуем от родителей компонентов их общего предка, действует принцип совместного использования компонентов: наследуется один компонент, и конфликта имен не возникает.
Запрет на дублирование имен касается лишь эффективных компонентов. Если один или более компонентов с омонимичными именами являются отложенными, их можно фактически слить воедино, поскольку отсутствует несовместимость реализаций. Подробнее мы поговорим об этом чуть ниже.
Приведенные правила просты и интуитивны. Чтобы в последний раз нам убедиться в их правильном понимании, построим простой пример, демонстрирующий допустимые и недопустимые варианты наследования.
Рис. 15.20. Два варианта наследования
class A feature
this_one_OK: INTEGER
end
class B inherit A feature
portends_trouble: REAL
end
class C inherit A feature
portends_trouble: CHARACTER
end
class D inherit
-- Это неправильный вариант!
C
end
Класс D наследует this_one_OK дважды, один раз от B, другой раз - от C. Конфликта имен не возникает, поскольку данный компонент будет использоваться совместно. На самом деле, это - один компонент предка A.
Два компонента portend_trouble ("предвещающие беду") заслуженно получили такое имя. Они различны, потому их появление в D ведет к конфликту имен, делая класс некорректным. (У них разные типы, но и одинаковые типы никак не повлияли бы на ход нашего обсуждения.)
Переименовав один из компонентов, мы с легкостью сделаем D корректным:
class D inherit
-- Этот вариант класса теперь полностью корректен.
rename portends_trouble as does_not_portend_trouble_any_more end
C
end
- Общие предки
- По обе стороны океана
- Совместное использование и репликация
- Ненавязчивое дублирующее наследование
- Правило переименования
- Конфликт переопределений
- Конфликт при совместном использовании: отмена определения и соединение компонентов
- Конфликты при репликации: выделение
- Выделение всех компонентов
- Сохранение исходной версии при переопределении
- Пример повышенной сложности
- Дублируемое наследование и универсальность
- Правила об именах
- 3. Null-значения и общее правило вычисления выражений
- 3. Унарная операция переименования
- 3. Операция переименования.
- Правило 16. Группируйте связанные между собой элементы
- Файлы без расширения, как правило, текстовые. Как сделать, чтобы при двойном щелчке кнопкой мыши они открывались в Блокн...
- Правило успеха № 3. Знать и грамотно использовать инструменты выразительности и убедительности
- Правило № 35 Немедленно откажитесь от того, что делает конкурент
- Глава 3 Правило непрерывного изменения
- Правило 11: не влюбляйтесь в свои диаграммы!
- Пример A-3. rn: Очень простая утилита для переименования файлов
- Эвристическое правило номер 4: Симпатия – основа взаимосвязи и доверия
- «Правило 98 %»