Скрытие потомком
Скрытие потомком
Прежде чем искать решение проблемы ковариантности, рассмотрим еще один механизм, способный в условиях полиморфизма привести к нарушениям типа. Скрытие потомком (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 корректен. В результате выполнения в прямоугольнике появится еще одна вершина, а значит, будет создан недопустимый объект.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Скрытие и открытие вложенных списков
Скрытие и открытие вложенных списков Вложенные списки в полосе навигации чрезвычайно громоздки. Как бы сделать так, чтобы все они были скрыты и появлялись только при щелчке на пункте "внешнего" списка, в который они вложены?Легко!— Изначально все вложенные списки у нас
Скрытие и открытие текста примеров
Скрытие и открытие текста примеров На Web-страницах, описывающих теги HTML и атрибуты стиля CSS, мы поместили текст примеров применения того или иного тега или атрибута стиля. Часто его делают скрывающимся и открывающимся в ответ на щелчок мышью — так можно сделать Web-страницы
Скрытие и открытие вложенных списков
Скрытие и открытие вложенных списков Вложенные списки в полосе навигации чрезвычайно громоздки. Как бы сделать так, чтобы все они были скрыты и появлялись только при щелчке на пункте "внешнего" списка, в который они вложены?Легко!— Изначально все вложенные списки у нас
Скрытие и открытие текста примеров
Скрытие и открытие текста примеров На Web-страницах, описывающих теги HTML и атрибуты стиля CSS, мы поместили текст примеров применения того или иного тега или атрибута стиля. Часто его делают скрывающимся и открывающимся в ответ на щелчок мышью — так можно сделать Web-страницы
Скрытие и показ значков апплетов
Скрытие и показ значков апплетов Данные настройки позволяют скрыть отдельные значки апплетов Панели управления, либо наоборот, показать только разрешенные значки. Начнем с первого варианта. Он состоит из двух частей. Если вы хотите скрыть отдельные значки в папке Панели
29. Описание и скрытие имен
29. Описание и скрытие имен Описание определяет имя в области видимости. Таким образом, имя может применяться только в некоторой части программы. Для имени, которое описано в функции (такое имя часто называют локальным), эта область видимости располагается от точки
Скрытие объектов
Скрытие объектов Чтобы облегчить управление сложными сценами, используют скрытие объектов. Это ускоряет отрисовку объектов в окнах проекций, в результате чего возрастает скорость работы. Скрытые объекты невидимы, и их нельзя выделить.Скрыть объекты можно несколькими
Скрытие строк и столбцов
Скрытие строк и столбцов При работе с таблицей Excel нередко используют множество ячеек, содержащих, например, формулы, какие-либо константы, редко изменяемые данные, которые участвуют в подсчетах различных итогов, но не должны отображаться на экране или в распечатанном
Скрытие вкладок
Скрытие вкладок Например, при необходимости можно удалить вкладку Сеть. Для этого в разделе HKEY_CURRENT_USERSoftwarePoliciesMicrosoftWindowsMediaPlayer необходимо создать REG_DWORD-параметр HideNetworkTab и присвоить ему значение 1. Ниже приведен текст соответствующего REG-файла (расположение на компакт-диске
Скрытие информации
Скрытие информации Правило Скрытия Информации можно сформулировать следующим образом: Разработчик каждого модуля должен выбрать некоторое подмножество свойств модуля в качестве официальной информации о модуле, доступной авторам клиентских модулей.Применение этого
У3.3 Ограничения на скрытие информации
У3.3 Ограничения на скрытие информации Представляете ли вы себе обстоятельства, при которых скрытие информации не должно применяться к связям между модулями?
Селективный экспорт и скрытие информации
Селективный экспорт и скрытие информации До сих пор все компоненты класса были доступны всем потенциальным клиентам. Это, безусловно, не всегда приемлемо, поскольку скрытие информации является важным элементом построения последовательной и гибкой
Наследование и скрытие информации
Наследование и скрытие информации Последний вопрос, оставшийся пока без ответа, как наследование взаимодействует с принципом Скрытия информации.В отношениях между классом и его клиентами скрытие информации определяет разработчик класса. Именно он определяет политику
Ковариантность и скрытие потомком
Ковариантность и скрытие потомком Если бы мир был прост, то разговор о типизации можно было бы и закончить. Мы определили цели и преимущества статической типизации, изучили ограничения, которым должны соответствовать реалистичные системы типов, и убедились в том, что