Я создал свою собственную реализацию дерева для различных причин и разработал два класса: базовый класс, который является общим узлом дерева, переполненным логикой, и другой класс, который расширяет этот класс. тот, который является более специализированным.
В моем базовом классе некоторые методы включают создание новых узлов дерева (например, добавление дочерних элементов). Эти экземпляры находятся внутри логики (скажем, во вложенном цикле), что затрудняет отделение логики от реализации.
Итак, если я не переопределю эти экземпляры в определенном классе, будет создан неправильный тип узла. Однако я не хочу, чтобы переопределял эти методы, потому что они также содержали общую логику, которая не должна дублироваться!
Проблема может быть сведена к следующему:
public class Foo {
public String value() { return "foo"; }
public Foo doStuff() {
// Logic logic logic..
return new Foo();
}
}
class Bar extends Foo {
public String value() { return "bar"; }
}
new Bar().doStuff().value(); // returns 'foo', we want 'bar'
Первым, что пришло мне в голову, будет «ловушка создания», которую расширяющие классы могут переопределить:
public Foo createFooHook(/* required parameters */) {
return new Foo();
}
Теперь. хотя это была хорошая первая мысль, от этого кода воняет нечто ужасное. В этом есть что-то очень ... неправильное .
Это похоже на приготовление пищи в обнаженном виде - кажется опасным и ненужным .
Итак, как бы вы справились с этой ситуацией?