私はさまざまな理由で独自のTree実装を作成し、2つのクラスを考え出しました。1つはロジックがぎっしり詰まったジェネリックツリーノードである「base」クラスで、もう1つはより特殊なクラスを拡張するクラスです。
私の基本クラスでは、特定のメソッドに新しいツリーノードのインスタンス化が含まれます(子の追加など)。これらのインスタンス化はロジック内にあり(たとえば、ネストされたループ内)、ロジックをインスタンス化から分離するのが困難になります。
したがって、特定のクラスでこれらのインスタンス化をオーバーライドしないと、間違ったタイプのノードが作成されます。ただし、これらのメソッドには、複製してはならない共有ロジックも含まれているため、これらのメソッドをオーバーライドしたくありません。
問題はこれに要約することができます:
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();
}
今。それは素晴らしい最初の考えでしたが、そのコードから何かひどい悪臭が出てきました。何か非常に...それについて間違っています。
それは裸で料理をするようなものです-それは危険で不必要だと感じます。
では、この状況にどのように対処しますか?