5

例として:

public class Foo {
    private Foo() {}
}

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

    static public doSomething() {
    }
}

それはコンパイルエラーです。クラスは、少なくとも、そのスーパークラスのデフォルト コンストラクターを暗黙的に呼び出す必要があります。この場合、これはFooには表示されません。

代わりにBarからObjectのコンストラクターを呼び出すことはできますか?

4

4 に答える 4

10

できません。少なくとも Foo のコンストラクター パッケージを非公開にする必要があります (ただし、おそらく保護するだけです。

(編集 - この投稿のコメントは良い点です)

于 2009-01-20T16:47:24.703 に答える
7

これは実際には、実装継承と呼ばれる悪い形式の継承の兆候です。元のクラスが継承されるように設計されていなかったため、プライベート コンストラクターを使用することを選択したか、API 全体の設計が不十分でした。

これを修正するには、継承する方法を見つけることではなく、継承する代わりにオブジェクトを構成できるかどうかを確認し、インターフェイスを介してそれを行います。つまり、クラス Foo は、FooImpl を持つインターフェース Foo になりました。次に、インターフェース bar は、FooImpl とは関係のない BarImpl を使用して Foo を拡張できます。

BarImpl 内で、コードを再利用したい場合は、内部に FooImpl をメンバーとして含めることができますが、それは完全に実装次第であり、公開されません。

于 2009-01-21T10:14:23.263 に答える
2

Foo にプライベート コンストラクターがある限り、Bar のインスタンスを作成することはできません。それを行う唯一の方法は、Foo に保護されたコンストラクターがある場合です。

于 2009-01-20T16:47:31.800 に答える
1

Object のコンストラクターが Foo のサブクラスである場合、Bar から直接呼び出すことはできません。この場合はプライベートな Foo のコンストラクターを介して呼び出す必要があります。

Foo のコンストラクターを private と宣言すると、デフォルトの public コンストラクターは作成されません。BarFoo のコンストラクターを呼び出さなければならないため、非公開のままにすることはできません。他の人がそうであるように、private の代わりに protected を使用することをお勧めします。

于 2009-01-20T16:50:46.130 に答える