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