繁体   English   中英

在java中,如何使用私有构造函数创建一个类,其超类也有一个私有构造函数?

[英]In java, how do I make a class with a private constructor whose superclass also has a private constructor?

举个例子:

public class Foo {
    private Foo() {}
}

public class Bar extends Foo {
    private Bar() {}

    static public doSomething() {
    }
}

那是一个编译错误。 一个类至少需要隐式调用它的超类的默认构造函数,在这种情况下,它在Foo中是不可见的。

我可以从Bar调用Object的构造函数吗?

你不能。 你需要让Foo的构造函数包至少是私有的(虽然我可能只是让它受到保护。

(编辑 - 这篇文章中的评论很有用)

这实际上是一种糟糕的继承形式的症状,称为实现继承。 原始类不是为了继承而设计的,因此选择使用私有构造函数,或者整个API设计不当。

解决这个问题的方法不是找出继承的方法,而是要确定是否可以组合对象而不是继承,并通过接口来实现。 即,Foo类现在是Foo接口,具有FooImpl。 然后界面栏可以扩展Foo,使用BarImpl,它与FooImpl无关。

在BarImpl内部,如果你想做一些代码重用,你可以将FooImpl作为成员,但这完全取决于实现,并且不会暴露。

只要Foo具有私有构造函数,您将无法创建Bar的实例。 你能做到的唯一方法就是Foo有一个受保护的构造函数。

你不能直接从Bar调用Object的构造函数,而它是Foo的子类,它必须通过Foo的构造函数,在这种情况下是私有的。

当您将Foo的构造函数声明为private时,它不会创建默认的公共构造函数。 由于Bar 必须调用Foo的构造函数,因此不可能将其保密。 我会像其他人一样建议使用protected而不是private。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM