[x]. Прибегнув к переопределению типов, мы можем менять объявления в порожденном классе, не затрагивая оригинал. При этом чисто ковариантное решение потребует правки оригинала путем описанных преобразований.
[x]. Скрытие потомком защита от многих неудач при создании класса. Можно критиковать проект, в котором
Желая сохранить гибкость адаптации порожденных классов для наших нужд, мы должны разрешить и ковариантное переопределение типов, и скрытие потомком. Далее мы узнаем, как этого добиться.
Глобальный анализ
Этот раздел посвящен описанию промежуточного подхода. Основные практические решения изложены в лекции 17.
Изучая вариант с закреплением, мы заметили, что его основной идеей было разделение ковариантного и полиморфного наборов сущностей. Так, если взять две инструкции вида
s := b ...
s.share (g)
каждая из них служит примером правильного применения важных ОО-механизмов: первая - полиморфизма, вторая - переопределения типов. Проблемы начинаются при объединении их для одной и той же сущности
p := r ...
p.add_vertex (...)
проблемы начинаются с объединения двух независимых и совершенно невинных операторов.
Ошибочные вызовы ведут к нарушению типов. В первом примере полиморфное присваивание присоединяет объект
Вот и идея нового решения: заранее - статически, при проверке типов компилятором или иными инструментальными средствами - определим набор типов (typeset) каждой сущности, включающий типы объектов, с которыми сущность может быть связана в период выполнения. Затем, опять же статически, мы убедимся в том, что каждый вызов является правильным для каждого элемента из наборов типов цели и аргументов.
В наших примерах оператор
Эти наблюдения наводят нас на мысль о создании глобального подхода на основе нового правила типизации:
Правило системной корректности
Вызов
В этом определении вызов считается классово-корректным, если он не нарушает правила Вызова Компонентов, которое гласит: если
Системная корректность вызова сводится к классовой корректности за тем исключением, что она проверяется не для отдельных элементов, а для любых пар из наборов множеств. Вот основные правила создания набора типов для каждой сущности:
1 Для каждой сущности начальный набор типов пуст.
2 Встретив очередную инструкцию вида create {SOME_TYPE} a, добавим
3 Встретив очередное присваивание вида
4 Если
5 Будем повторять шаги (3) и (4) до тех пор, пока наборы типов не перестанут изменяться.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии