Я бы посоветовал взглянуть на абстрактный шаблон фабрики , так как это, кажется, то, чего вы пытаетесь достичь. Правильно реализованный, он включает в себя несколько абстрактных классов и множество подклассов, но это не так страшно, как кажется.
То, что вы пытаетесь сделать, в основном выглядит как компактная версия этого, но, как правило, это не очень хороший подход, так как это приводит к трудностям в отслеживании ОО-кода спагетти, который перемещается назад и вперед между родителем и подклассом.
Помните, что вы уже определили Родителя как абстрактного по причине.
Я подозреваю, что ваша цель - максимизировать повторное использование кода, обычно, когда я вижу такой код, это потому, что есть некоторый распространенный код инициализации "CoolObject", который вы не хотите дублировать в дочерних классах.
В этом случае, как правило, лучше написать общий частный или защищенный инициализатор «CoolObject» в родительском объекте, но все же создать специальный тип CoolObject в дочерних классах, а затем инициализировать его с помощью метода родительского класса, прежде чем возвращать его из ребенок.
В этом случае, поскольку он является геттером, не может быть ничего, кроме возврата частного объекта. Если это так, то лучше всего определить общий метод получения как абстрактный в Parent, а затем переопределить в каждом дочернем элементе. Основная проблема заключается в том, что везде, где вы используете этот код, вам необходимо постоянно вводить тип конкретного CoolObject, который вы ожидаете.
Из-за этого, вероятно, что в будущем, даже если вы предоставите либо абстрактный получатель CoolObject, либо конкретный получатель CoolObject в Parent, вы все равно захотите иметь конкретные реализации получателей для определенных типов CoolObject.
При проектировании чего-то подобного следует помнить о том, как это будет использоваться.
Если цель состоит в том, чтобы предоставить абстракцию для различных типов CoolObject, то вы в основном используете шаблон стратегии. В этом случае возможность приведения переменных к подтипу CoolObject не требуется. В этом случае возможен гетеретический тип (абстрактный или конкретный).
Имея два конкретных дочерних класса Parent, однако, вы не чувствуете, что это то, к чему вы стремитесь. Опять же, я бы посоветовал взглянуть на абстрактный шаблон фабрики , так как это больше похоже на то, что вы пытаетесь сделать.