java - 子类继承基类构造函数,同时保持代码重用原则

标签 java oop inheritance constructor hierarchy

所以这段代码有错误,因为基类有参数,对吧?因为每个子类的默认构造函数都会调用基类的默认构造函数?并且我们没有导致错误的基类的默认构造函数?

我是否误解了它,以及在实现代码重用原则时解决这个问题的最佳方法是什么,因为我正在尝试在 OOP 中练习编程

class A {
    int item;

    A(int item) {
        this.item = item;
    }
}

class B extends A {
    int subitem;

    B(int item) {
        super(item);
        subitem = item * 2;
    }
}

class C extends A {

}

最佳答案

首先,关于这个问题的标题:

Subclasses inherting base class constructor while maintaining principle of code-reuse

构造函数永远不会被继承。它就是不会发生。您所演示的不是继承 - 它只是要求任何构造函数(java.lang.Object 中的构造函数除外)必须其中之一 链接到同一个类中的另一个构造函数, 链接到父类(super class)中的构造函数。

So this code has an error because the base class has parameters right?

嗯,准确地说,是因为基类没有无参构造函数。

Because the default constructor of each subclass calls the default constructor of the base class?

仅当您未显式指定任何构造函数时,才会提供默认构造函数。默认构造函数始终隐式调用基类中的无参数构造函数。

and we don't have a default constructor for the base class which causes the error?

我们没有基类的无参数构造函数。基本上相当于写:

class C extends A {
    C() {
        super();
    }
}

如果您理解为什么那个无法编译,您就会理解为什么没有任何显式声明的构造函数的版本无法编译,因为它们是等效的。

Did I misunderstand it, also what is the best way around this

大约什么?如果不提供 item,则无法创建 A 的实例。如果它确实编译了那就糟糕了 - item会是什么? C 的每个实例也可以被视为一个 A,它需要一个 item...

您可以编写一个无参数构造函数,为父类(super class)构造函数提供某种默认值:

public C() {
    super("default item");
}

如果这就是你想要的。但除此之外,如果不知道您想要实现什么目标,我们就无法真正提出替代方案。

请注意,继承远不是实现代码重用的唯一方法 - 事实上,我个人更喜欢通过组合而不是一般的继承来重用。继承很强大,但在我看来被过度使用了。

关于java - 子类继承基类构造函数,同时保持代码重用原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14383259/

相关文章:

java - 需要更快的方法来获取缓冲图像的每个像素的 RGB 值

javascript - 对象列表因某些别名而损坏

c++ - 使用类的构造函数时出错

javascript - 对于 JavaScript 的继承,是引用父类的原型(prototype)还是复制父类的原型(prototype)更好?

java - 如何将任意 JSON 转换为 Java 中可用的结构

java - java中无法按 "=="或 "!="分割

java - onBeforeRender() 内的 Wicket setResponsePage()

java - 我们可以直接实例化一个抽象类吗?

c++ - 指向基类的成员指针

c++ - 从 C++ 中的抽象类派生的类中没有销毁阶段