举个例子:
public class Foo {
private Foo() {}
}
public class Bar extends Foo {
private Bar() {}
static public doSomething() {
}
}
Run Code Online (Sandbox Code Playgroud)
那是一个编译错误.一个类至少需要隐式调用它的超类的默认构造函数,在这种情况下,它在Foo中是不可见的.
我可以从Bar调用Object的构造函数吗?
这实际上是一种糟糕的继承形式的症状,称为实现继承.原始类不是为了继承而设计的,因此选择使用私有构造函数,或者整个API设计不当.
解决这个问题的方法不是找出继承的方法,而是要查看是否可以组合对象而不是继承,并通过接口来实现.即,Foo类现在是Foo接口,具有FooImpl.然后界面栏可以扩展Foo,使用BarImpl,它与FooImpl无关.
在BarImpl内部,如果你想做一些代码重用,你可以将FooImpl作为成员,但这完全取决于实现,并且不会暴露.
| 归档时间: |
|
| 查看次数: |
5902 次 |
| 最近记录: |