在Java中,我可以为非扩展实例创建构造函数吗?

时间:2014-01-24 02:34:32

标签: java inheritance

假设我有两个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.
  }
}

有更清洁的方法吗?

2 个答案:

答案 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())。