【问题标题】:How to stop enforcing child classes to implement parent constructor如何停止强制子类实现父构造函数
【发布时间】:2021-05-12 12:19:15
【问题描述】:

让我们考虑以下类:

public abstract class Parent{
    
    protected Parent(Object object){
        
        /* ... */
        
    }
    
}

还有以下一个:

public final class Child1 extends Parent{
    
    public Child1(Object object){
        
        super(object);
        
    }
    
}

是否有任何通用方法可以停止在扩展 Parent 类的类中执行调用 super(object) 的构造函数,因此始终调用 Parent 构造函数?

我想知道,因为我将有一堆类扩展父类,并且它们都将共享相同的构造函数,没有花哨的例外,所以我会节省时间(不是那么多,但我也是只是好奇)。

【问题讨论】:

  • 如果Parent 类中只有一个构造函数,则该构造函数必须通过super 调用。您要避免的问题是什么?
  • 另外,为什么你的父构造函数是protected?它是一个抽象类,所以只能实例化子类,只要保持那个构造函数是一个普通的public构造函数?
  • 我试图避免在 Parent 的每个子类中写入 public Child(Object object){ super(object); }
  • 1.你将不得不忍受它。显然,即使是龙目岛也不会帮助你。 2. 另外,如果你的简单项目有复杂的类层次结构,可能你的设计搞砸了?

标签: java constructor extends


【解决方案1】:

子类总是必须调用其父类的构造函数之一。

即使在父类中的无参数构造函数的情况下也是如此:

class Parent {
  Parent() {}
}

class Child extends Parent {
  Child() {}
}

编译器会在子构造函数中插入一个调用:

class Child extends Parent {
  Child() {
    super();
  }
}

如果Parent 类的构造函数都需要参数,编译器不能假定它可以通过Child 构造函数参数:

class Child extends Parent {
  Child(Object first, Object second) {
    super(???);  // Which of the parameters do you pass here?
  }
}

即使只有一个 Child 构造函数参数,编译器也无法知道您是否真的要按原样传递该参数,或者您是否真的打算传递从它派生的某个值(甚至不传递) :

  Child(Object first) {
    super(first);
  }

  Child(Object first) {
    super(first + "");
  }

  Child(Object first) {
    super("Hello world");
    first.doThing();
  }

每一个(以及更多)都是同样有效的选择。

编译器不知道你想要什么,所以你必须明确地告诉它。抱歉,没办法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2011-09-27
    • 2013-09-25
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多