[英]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.