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

在Java中,我可以为非扩展实例创建构造函数吗?,java,inheritance,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()

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

有更干净的方法吗?

在这里,用超类交换子类似乎是合适的。这样就不需要进行类型检查

如果您的一些其他功能因此被破坏(我假设您处于项目的早期设计阶段),那么我建议您认真重新考虑设计


希望这有帮助。祝你好运。

如果超级类在子类存在之前必须知道它们,那么你选择的是循环依赖,在我看来,除非你真的知道自己在做什么,否则它几乎总是糟糕的设计。为了在任何地方解决问题,你必须在任何地方解决所有问题,否则依赖链中的任何东西都不会起作用

这也暗示了直接在构造函数中调用接口函数的问题,这是一件坏事,因为一旦该函数被重写,超级版本将永远不会被再次调用

虽然我不知道您在这里实际想要实现什么,但这可能是一个更好的设计:

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\u thingsMC()
),子的东西也可以做(使用
do\u thingsMO()
),公开地说,你的代码的用户可以保证能够做任何事情(使用
do\u things()
)。

我认为你已经打破了“is-a”超类和子类之间的关系。您的继承关系似乎不是太强。那为什么要使用继承呢。一种解决方法,您可以始终在
MyOther
中覆盖该方法
myown\u things
,以清空该方法。。但是在构造函数中重写方法不是一个好方法practice@JimGarrison这正是我想要的think@alfasin您不能调用
super()
。这似乎是一个错误。我不能提供使用继承的解决方案,因为您的孩子和家长之间的关系似乎不是这样的关系。我会重新考虑做一个新的设计这是我需要的。我在几个小时前读到了这篇文章,第一次没有读到,但这就是它!像许多StackOverflow问题一样,现在我有了答案:当一个子类调用其父类的构造函数,而该父类构造函数调用子类重写的方法时,父类构造函数将调用被重写的方法,而不是原始方法。就是这样;这比我想象的要简单得多。谢谢