Основные свойства наследования
Ассоциации наследования, подобные Internal-InternalChild
называются наследованием
, внутренний класс в такой ассоциации — предок
, а внешний — потомок
.
Основные свойства наследования
- При наследовании атрибутный состав и состав связей всегда расширяется и не может сокращаться (при этом каждая унаследованная таблица хранит
все
атрибутывсех
предков). - Наследнику доступны все атрибуты и ассоциации предка. Так, если взять за внутренний класс
InternalChild
, то его атрибуты будутAttr1
иAttr2
, мастераMaster1
,Master2
,Master3
, детейлыDetail1, Detail2, Detail3, Detail4
. - Предок обеспечивает полиморфный доступ ко всем своим наследникам, что означает, что экземпляру внутреннего класса и его наследникам (в данном случае —
Internal и InternalChild
) может быть установлен как экземпляр мастерового класса (в данном случаеMaster2
), так и экземпляр любого наследника мастера (в данном случаеMaster2Child
). Аналогична ситуация и с детейлами: экземплярInternal
одинаково, черезDetail2
оперирует с экземплярамиDetail2 и Detail2Child
, аналогично и для атрибутов и методов класса. На практике данное явление может вызвать проблему, решаемую с помощью TypeUsage, которое особым образом отображается в структуру данных. - Если у наследника есть атрибут, метод (с тем же составом параметров), ассоциация (с тем же именем роли), то это значит, что наследник
перегружает
данный элемент предка. - Наследник от мастера может являться детейлом того же внутреннего класса (как в ситуации
Internal-Master1-Detail4
), это нормально.
Note: Часто задаётся вопрос, почему таблицы наследников хранят все атрибуты всех предков, а не только свои. Ответ: тогда при чтении объекта-наследника необходимо собирать все атрибуты от таблиц предков по цепочке через
JOIN
, что очень медленно, особенно при чтении разнотипных объектов одним запросом. Следовательно, производительность приложения будет падать с ростом числа уровней наследования, что неприемлемо.