2

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

我是否误解了它,在实现代码重用原则时最好的解决方法是什么,因为我正在尝试在 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 {

}
4

2 回答 2

2

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

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

构造函数永远不会被继承。它只是不会发生。您一直在演示的不是继承——它只是要求任何构造函数(除了 in 中的构造函数java.lang.Object)必须链接到同一类中的另一个构造函数,或者链接到超类中的构造函数。

所以这段代码有错误,因为基类有参数对吗?

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

因为每个子类的默认构造函数都调用了基类的默认构造函数?

仅当您未明确指定任何构造函数时才提供默认构造函数。默认构造函数总是隐式调用基类中的无参数构造函数。

并且我们没有导致错误的基类的默认构造函数?

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

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

如果你理解为什么不能编译,你就会理解为什么没有任何显式声明的构造函数的版本不能编译,因为它们是等价的。

我误会了吗,还有什么是最好的解决方法

围绕什么?如果A不提供item. 如果它确实编译会很糟糕 - 那会item是什么?的每个实例C也可以被认为是一个A,这需要一个item...

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

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

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

请注意,继承远非实现代码重用的唯一方法——事实上,我个人更喜欢通过组合重用,而不是一般的继承。继承功能强大,但过度使用了 IMO。

于 2013-01-17T16:13:52.923 回答
0

您的类C扩展A它必须满足在构造函数中显式调用其单参数构造函数的合同,或者您可以简单地在类 A 中定义一个无参数默认构造函数,例如:

class A {
    int item;

    A(int item) {
        this.item = item;
    }
    A(){
     //default stuff
     }
}
于 2013-01-17T16:13:51.187 回答