由于各种原因,我创建了自己的 Tree 实现,并提出了两个类,一个是“基”类,它是一个充满逻辑的通用树节点,另一个类扩展了更专业的类。
在我的基类中,某些方法涉及实例化新的树节点(例如添加子节点)。这些实例化在逻辑内部(例如在嵌套循环中),这使得逻辑难以与实例化分离。
因此,如果我不在特定类中覆盖这些实例,则会创建错误类型的节点。但是,我不想覆盖这些方法,因为它们还包含不应重复的共享逻辑!
问题可以归结为:
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();
}
现在。虽然这是一个很好的第一个想法,但从代码中散发出一股可怕的恶臭。有一些非常...错的地方。
这就像光着身子做饭一样——感觉很危险,也没有必要。
那么,你会如何处理这种情况呢?