Книга: Основы объектно-ориентированного программирования
Скрытие потомком
Скрытие потомком
Прежде чем искать решение проблемы ковариантности, рассмотрим еще один механизм, способный в условиях полиморфизма привести к нарушениям типа. Скрытие потомком (descendant hiding) - это способность класса не экспортировать компонент, полученный от родителей.
Рис. 17.8. Скрытие потомком
Типичным примером является компонент add_vertex (добавить вершину), экспортируемый классом POLYGON, но скрываемый его потомком RECTANGLE (ввиду возможного нарушения инварианта - класс хочет оставаться прямоугольником):
class RECTANGLE inherit
POLYGON
export {NONE} add_vertex end
feature
...
invariant
vertex_count = 4
end
Не программистский пример: класс "Страус" скрывает метод "Летать", полученный от родителя "Птица".
Давайте на минуту примем эту схему такой, как она есть, и поставим вопрос, будет ли легитимным сочетание наследования и скрытия. Моделирующая роль скрытия, подобно ковариантности, нарушается из-за трюков, возможных из-за полиморфизма. И здесь не трудно построить вредоносный пример, позволяющий, несмотря на скрытие компонента, вызвать его и добавить прямоугольнику вершину:
p: POLYGON; r: RECTANGLE
...
create r; -- Создание объекта RECTANGLE.
p := r; -- Полиморфное присваивание.
p.add_vertex (...)
Так как объект r скрывается под сущностью p класса POLYGON, а add_vertex экспортируемый компонент POLYGON, то его вызов сущностью p корректен. В результате выполнения в прямоугольнике появится еще одна вершина, а значит, будет создан недопустимый объект.
- Ковариантность и скрытие потомком
- 8.8.11. Мероприятие 12: Раскрытие информации о механизмах агрессивного налогового планирования
- 12.7.2. Раскрытие имени файла: glob() и globfree()
- Скрытие CPL-файлов
- Скрытие вкладок и других элементов диалогового окна
- Скрытие различных элементов диалога Параметры
- Скрытие возможности редактирования списка учетных записей Outlook Express
- Скрытие возможности работы с Windows Messenger
- Скрытие строк и столбцов от посторонних
- Скрытие информации (information hiding)
- Скрытие информации
- У3.3 Ограничения на скрытие информации