2009-01-20 139 views
5

举个例子:在java中,如何使用其父类也有私有构造函数的私有构造函数创建类?

public class Foo { 
    private Foo() {} 
} 

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

    static public doSomething() { 
    } 
} 

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

我可以致电对象的构造函数从改为?

+0

Foo(){}被私有而不是被保护是否有理由? – 2009-01-20 16:49:16

+1

@svelil:假设它位于第三方库中,或者在我的控制之外,我想对它进行子类化。 – 2009-01-20 17:08:27

回答

10

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

(编辑 - 在这个岗位评论做出好点)

+0

包私有就足够了,如果两者都放在同一个包中。 – starblue 2009-01-20 16:59:01

2

您将无法创建一个Bar实例,只要Foo有一个私有构造函数,只要Foo有一个受保护的构造函数,你就可以做到这一点的唯一方法:

1

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

当你声明美孚公司的C onstructor私有,它不创建默认的公共构造函数。由于酒吧来调用Foo的构造函数,因此不可能将其私有。与其他人一样,我会建议使用受保护的而不是私人的。

7

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

这种情况的解决方法是不是想出一个办法来继承,而是看你是否能组成对象,而不是继承的,并通过接口这样做。即,Foo类现在是Foo接口,带有FooImpl。然后界面栏可以使用BarImpl扩展Foo,它与FooImpl无关。

里面BarImpl,你可以,如果你希望做一些代码重用,有FooImpl中的一员,但是这完全取决于执行,并不会被暴露。

相关问题