Согласованность типов
Наследование согласовано с системой типов. Основные правила легко объяснить на приведенном выше примере. Предположим, что имеются следующие объявления:
p: POLYGON
r: RECTANGLE
Выделим в приведенной выше иерархии нужный фрагмент (рис. 14.6).
Тогда законны следующие выражения:
[x].
[x].
[x].
[x].
[x].
Рис. 14.6. Фрагмент иерархии геометрических фигур
А следующие вызовы компонентов незаконны, так как эти компоненты недоступны на уровне многоугольника:
p.side1
p.side2
p.diagonal
Это рассмотрение основано на первом фундаментальном правиле типизации:
Правило Вызова Компонентов
Если тип сущности
Напомним, что класс
Как и все другие правила корректности, рассматриваемые в этой книге, правило Вызова Компонентов является статическим, - его можно проверять на основе текста системы, а не по ходу ее выполнения. Компилятор (который, как правило, выполняет такую проверку) будет отвергать классы, содержащие некорректные вызовы компонентов. Если успешно реализовать проверку правил типизации, то не возникнет риск того, что скомпилированная система когда-либо во время выполнения применит некоторый компонент к объекту неподходящего типа.
Статическая типизация - это один из главных ресурсов ОО-технологии для достижения объявленной в 1-ой лекции цели - надежности ПО.
| Уже отмечалось, что не все подходы к построению ОО-ПО имеют статическую типизацию. Наиболее известным представителем языков с динамической типизацией является Smalltalk, в котором не действует статическое правило вызова, но допускается, чтобы вычисление аварийно завершалось в случае возникновения ошибки: 'сообщение не понятно'. В лекции, посвященной типизации, будет приведено сравнение разных подходов. |
Пределы полиморфизма
Неограниченный полиморфизм был бы несовместим со статическим понятием типа. Допустимость полиморфных операций определяется наследственностью.
Все примеры полиморфных присваиваний, такие, как
Определение: согласованность
Тип
Почему недостаточно понятия потомка в этом определении? Причина снова в том, что допускается порождение из родовых классов, поэтому приходится различать типы и классы. Для каждого типа имеется базовый класс, который при отсутствии порождения совпадает с самим типом (например,
Заметим, что поскольку каждый класс является собственным потомком, то каждый тип согласован сам с собой.
При таком обобщении понятия потомка получаем второе важное правило типизации:
Правило согласования типов
Присоединение к источнику
