Logo

21 марта 2015 г.

Множественное наследование и взаимная абстрактность

Этот пост по-быстрому адаптирован из моего ответа на «Тостере» ради краткого изложения некоторых принципов ООП в Канторе.

Принципы SOLID покрывают общий случай наследования в ООП, когда классы могут наследоваться друг от друга без посредничества интерфейсов. Следование SOLID должно способствовать нормализации классов, чтобы получилась сбалансированная ОО-система. При этом в самих SOLID явного правила нормализации нет, оно появляется в конкретной реализации:
Множественное наследование допустимо только от взаимно-абстрактных классов, — то есть классов, не имеющих реализации одинаковых методов. Одинаковость методов в языке определяется совместимостью по присваиванию с учетом ООП.
В языках с интерфейсами интерфейсы всегда взаимно-абстрактны реализующим их классам, поэтому классы могут реализовывать любое количество интерфейсов, принципы SOLID от этого не пострадают. Собственно, интерфейсы были введены в языки программирования ради упрощения модели наследования.

В Канторе интерфейсов нет, поэтому модель наследования — общий случай, регулируемый SOLID. Взаимная абстрактность в Канторе — отношение между классами, вычисляемое в момент компиляции. Класс-наследник не может иметь реализации свойств с одинаковыми сигнатурами, полученных от предков. Сигнатура — это комбинация имени и параметров свойства, ее уникальность определяется правилами перегрузки (overload).

Если все унаследованные свойства имеют разные сигнатуры, классы взаимно-абстрактны. В вырожденном случае взаимная абстрактность определяет, являются ли классы интерфейсами друг другу.