假设我有两个Java类:
class MyClass {
public MyClass() {
do_things();
}
}
class MyOther extends MyClass {
public MyOther() {
super(); // Will do_things().
}
}
如果我想在课程未延期时做一些事情怎么办?例如:
class MyClass {
public MyClass() {
do_things();
if (!(this instanceof MyOther)) {// Ugly
my_own_things();
}
}
}
class MyOther extends MyClass {
public MyOther() {
super(); // Will do_things() but not my_own_things.
}
}
有更清洁的方法吗?
答案 0 :(得分:0)
似乎在这里与超类交换子类似乎是合适的。这种方式不需要进行类型检查。
如果您的某些其他功能因此而被破坏(我假设您处于项目的早期设计阶段),那么我建议您认真重新考虑设计。
希望这会有所帮助。祝你好运。
答案 1 :(得分:0)
如果超类在它们存在之前必须知道它的子类,那么你选择循环依赖,在我看来,除非你真的知道你在做什么,否则几乎总是糟糕的设计。为了解决任何地方的问题,您必须修复每个问题到处,否则依赖链中的任何内容都无法正常运行。
这也暗示了在构造函数中直接调用接口函数的问题,这是一个糟糕的事情,因为一旦覆盖了该函数,就不会再次调用超级版本。
虽然我不知道你在这里想要实现什么,但这对你来说可能是更好的设计:
class MyClass {
public MyClass() {
do_thingsMC();
}
public void do_things() {
do_thingsMC();
}
protected void do_thingsMC() {
//Do super-things only
}
}
class MyOther extends MyClass {
public MyOther() {
super();
do_thingsMO();
}
public void do_things() {
super.do_things();
do_thingsMO();
}
protected void do_thingsMO() {
//Do sub-things only
}
}
现在可以在需要时(通过调用do_thingsMC()
)完成超级事情,也可以通过子事件(使用do_thingsMO()
)完成,并且公开地,您的代码的用户可以确保能够做所有事情(使用do_things()
)。