0

プライベート コンストラクターの使用を検索しようとしたときに、Singleton パターンでの使用しか見つかりませんでした。Singleton パターン以外に、Private Constructor を使用します。いくつかのリンクまたはコード例をいただければ幸いです。

4

3 に答える 3

3

他に次の 2 つの理由があります。

工場のパターン。

  • プライベート コンストラクターとパブリック静的メソッドを使用してそれらを呼び出します。

不変クラスの Builder パターン。

  • ネストされた変更可能な Builder クラスを使用し、そのインスタンスがプライベート コンストラクターに渡されます。

サンプル ビルダー パターン:

using System;

namespace Demo
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            var demo = new ImmutableClass.Builder{
                A = 1,
                B = "two",
                C = 3.0
            }.Build();
        }
    }

    public sealed class ImmutableClass
    {
        public sealed class Builder
        {
            public int A;
            public string B;
            public double C;

            public ImmutableClass Build()
            {
                return new ImmutableClass(this);
            }
        }

        private ImmutableClass(Builder builder)
        {
            _a = builder.A;
            _b = builder.B;
            _c = builder.C;
        }

        public int A
        {
            get
            {
                return _a;
            }
        }

        public string B
        {
            get
            {
                return _b;
            }
        }

        public double C
        {
            get
            {
                return _c;
            }
        }

        private readonly int _a;
        private readonly string _b;
        private readonly double _c;
    }
}
于 2013-03-22T13:21:24.040 に答える
2

簡単な答え: シリアライゼーションとチェーン コンストラクター。

より長い答え:

初期化に値を必要とするオブジェクトのシリアル化

public class SomeSerializableClass {

    private SomeSerializableClass() {} // Used only in serialization

    public SomeSerializableClass(int initParameter){
        this.Property = initParameter;
    }

    public int Property { get; set; }

}


public class Program{

    static void Main(){
        var obj1 = new SomeSerializableClass(42); // valid
        var obj2 = new SomeSerializableClass(); // invalid

        var xs = new XmlSerializer(typeof(SomeSerializableClass));
        var obj3 = (SomeSerializableClass)xs.Deserialize(someStream); // possible

    }

}

連鎖コンストラクター (一部のコンストラクター ロジックを因数分解):

public class SomeClass {

    private SomeClass(int initParameter) {
        this.Property = initParameter; // Will always be executed, the logic exists once        
    }


    public SomeSerializableClass(int initParameter, string otherParameter)
        : this(initParameter)
    {
    }
    public SomeSerializableClass(int initParameter, int againAntherParameter)
        : this(initParameter)
    {
    }

    public int Property { get; set; }

}
于 2013-03-22T13:23:32.023 に答える
0

たとえば、静的な Search(...) 関数の背後にある DataReader からオブジェクトを初期化するときに、プライベート コンストラクターを使用します。このようなコンストラクターは、パブリックの場合はほとんど意味がありません。

于 2013-03-22T13:20:49.373 に答える