12

シングルトンクラスを封印する必要がある理由を知りたい。コンストラクターをプライベートとして指定している場合、クラスが正しく派生しないようにすることができますか?..以下にMSDNから数行を貼り付けています。色を教えてください。

この戦略では、クラスのメンバーが最初に参照されたときにインスタンスが作成されます。共通言語ランタイムが変数の初期化を処理します。クラスは、インスタンスを追加する可能性のある派生を防ぐために封印されているとマークされています。クラスを封印することの賛否両論については、[Sells03]を参照してください。さらに、変数は読み取り専用としてマークされています。これは、静的初期化中(ここに表示)またはクラスコンストラクターでのみ割り当てることができることを意味します。

http://msdn.microsoft.com/en-us/library/ff650316.aspx

4

3 に答える 3

13

コンストラクターをプライベートとして指定すると、クラスが派生するのを防ぐことができますよね?

そうではない:

public class NotReallySingleton
{
    private NotReallySingleton() {}

    public class CursesFoiledAgain : NotReallySingleton
    {
    }
}

...

NotReallySingleton x = new CursesFoiledAgain();
NotReallySingleton y = new CursesFoiledAgain();

これが機能するのは、入れ子になった型を含む、型のプログラム テキストprivateにアクセスが制限されているためです。そのため、 のプライベート コンストラクターにアクセスできます。CursesFoiledAgainNotReallySingleton

しかし、これはさておき、あなたの意図が誰もクラスから派生できないということであれば、なぜその意図をできるだけ明確に伝えたくないのでしょうsealedか?

于 2012-07-26T11:52:57.150 に答える
2

sealedキーワードは、クラスを継承できないことを意味します。コンストラクターをプライベートに宣言すると、クラスのインスタンスを作成できなくなります。

これらは同じものではありません。プライベート コンストラクターを持つ基本クラスを持つことができますが、その基本クラスから継承し、いくつかのパブリック コンストラクターを定義し、その基本クラスを効果的にインスタンス化します。

コンストラクターは継承されない (基本クラスがプライベート コンストラクターを持っているからといって、派生クラスがすべてのプライベート コンストラクターを持っているわけではない) こと、および派生クラスは常に最初に基本クラス コンストラクターを呼び出すことに注意してください。クラスにマークを付けると、sealed誰かがクラスから継承するのを防ぐため、慎重に構築されたシングルトン クラスを簡単に回避することができなくなります。

于 2012-07-26T11:38:00.660 に答える
0

これは一種の設計ガイドラインであり、従うか従わないかは明らかです。abstractこれは、基本クラスが将来の混乱を避けるためにマークする場合のように、設計意図をマークしているだけです。

于 2012-07-26T11:37:57.167 に答える