Чтобы ответить на вопросы, почему может понадобиться такая реализация: вот пример.
Таблица базы данных содержит информацию о компьютерах, на компьютерах есть мониторы, если монитор имеет ЖК-дисплей, то его параметр равен «пикселям». Если монитор - телевизор, то его параметр - «линии». Все мониторы также имеют параметр «вес»
Структура данных этой таблицы включает в себя: id, RAM, monitor_indicator, вес, строки, пиксели.
Эту структуру данных можно реализовать в классах:
- Класс
Computer
{id, RAM, display}
- Имеется информация о компьютерах.
- Абстрактный класс
AbstractDisplay
{вес}
- Имеет общую информацию о дисплеях.
- Класс
LCDDisplay
{пикселей} наследует класс AbstractDisplay
- имеет информацию о ЖК-дисплее (в пикселях).
- Класс
TVDisplay
{lines} наследует класс AbstractDisplay
- он имеет информацию о телевизоре (строки).
Основная идея заключается в том, что основной класс (Владелец / Компьютер) встраивает другой класс (Parent / AbstractDisplay), который может иметь различный набор параметров в зависимости от типа внедренного класса.
Относительно того, как может быть создан экземпляр встроенного абстрактного класса: точно так же, как теперь создается экземпляр абстрактного класса в JPA: в приведенном выше примере «monitor_indicator» указывает на дочерний класс, который должен использоваться, это поле должно существовать в то время, когда класс Computer инстанцирован.