1. ホーム
  2. c#

なぜプライベートコンストラクタが必要なのか?

2023-11-11 19:54:53

疑問点

クラスがプライベートコンストラクタを持つ場合、そのクラスはインスタンス化されることはありません。 ですから、もし私のクラスがインスタンス化されずに使用されることを望むのであれば、それを静的にすることができます。

プライベートコンストラクタの使い道は?

また、シングルトン・クラスで使用されていますが、それ以外に使い道はありますか?

(注)上記シングルトンの場合を除いているのは、静的なクラスがあるのに、なぜシングルトンが全く必要ないのかが理解できないからです。私が質問で混乱するために、これに答えないかもしれません。)

どのように解決するのですか?

工場

プライベートコンストラクタは、ファクトリーパターン(言い換えれば、明示的なインスタンス生成ではなく、クラスのインスタンスを取得するために使用する静的関数)を使用する場合に便利な場合があります。

public class MyClass
{ 
    private static Dictionary<object, MyClass> cache = 
        new Dictionary<object, MyClass>();

    private MyClass() { }

    public static MyClass GetInstance(object data)
    {
        MyClass output;

        if(!cache.TryGetValue(data, out output)) 
            cache.Add(data, output = new MyClass());

        return output;           
    }
}

ネストされた子供による擬似シール

外側のクラスを継承するネストしたクラスは、プライベートコンストラクタにアクセスすることができます。

例えば、これを利用して、抽象クラスで あなたは は継承できるが、他の誰も継承できない抽象クラス( internal コンストラクタもまた、単一のアセンブリに継承を制限するためにここで動作します。 private コンストラクタはすべての実装をネストされたクラスにすることを強制します)。

public abstract class BaseClass
{
    private BaseClass() { }

    public class SubClass1 : BaseClass
    {
        public SubClass1() : base() { }
    }

    public class SubClass2 : BaseClass
    {
        public SubClass2() : base() { }
    }
}

ベースコンストラクタ

これらは、よりアクセスしやすい別のコンストラクタから呼び出される "ベース" コンストラクタを作成するために使用することも可能です。

public class MyClass
{
    private MyClass(object data1, string data2) { }

    public MyClass(object data1) : this(data1, null) { }

    public MyClass(string data2) : this(null, data2) { }

    public MyClass() : this(null, null) { }
}