Единственный способ, которым может существовать такая иерархия, - это если каждый уровень реализует свой интерфейс (где я использую интерфейс в более широком смысле, чем конкретный языковой термин).
Корневой узел не может реализовать getParent
- это единственный способ добиться ошибки компиляции, о которой я могу думать. Таким образом, «интерфейс» корневого узла не включает getParent
.
Первые дочерние элементы могут реализовать getParent
- но для обеспечения безопасности компиляции они должны возвращать тип, который во время компиляции известен как корневой узел (то есть тип, который не делает агрегат getParent
).
На следующем уровне реализация getParent
должна возвращать тип, который реализует getParent
, который возвращает корневой узел, который не имеет getParent
.
Короче говоря, даже если вы решили создать такую реализацию, это было бы очень хрупко, потому что вам нужно было бы написать другой код для работы с каждым уровнем иерархии.
Существуют определенные проблемы, когда проверка времени выполнения правильна , и это может быть одним из таких случаев. Если каждая проблема может быть решена во время компиляции, то каждая скомпилированная программа будет просто набором результатов (и, возможно, массивным оператором switch для выбора того, какой результат вы хотите вывести)