させるにはどうすればいいのでしはC#のコンストラクタとなる。
-
13-09-2019 - |
質問
以下のコードで構成 二つのクラス:
- SmartForm (簡単なモデルクラス)
- SmartForms 複数のクラスのコレクションを含みま SmartForm オブジェクト)
こういうことができるようインスタンスを生成するの両方の特異や複数の授業 このような (いたい場合は、ファクトリメソッドGetSmartForm()):
SmartForms smartForms = new SmartForms("all");
SmartForm smartForm = new SmartForm("id = 34");
めの論理 のみ、複数のクラスをデータベースへのアクセス.の特異クラスは、求められた場合はインスタンスを生成そのものは、単にインスタンス化複数のクラス、そしてそのオブジェクトの複数のオブジェクトのコレクションと なるオブジェクト.
そうい? って割り当てるオブジェクト this
る方法でやらねばならない。
using System.Collections.Generic;
namespace TestFactory234
{
public class Program
{
static void Main(string[] args)
{
SmartForms smartForms = new SmartForms("all");
SmartForm smartForm = new SmartForm("id = 34");
}
}
public class SmartForm
{
private string _loadCode;
public string IdCode { get; set; }
public string Title { get; set; }
public SmartForm() {}
public SmartForm(string loadCode)
{
_loadCode = loadCode;
SmartForms smartForms = new SmartForms(_loadCode);
//this = smartForms.Collection[0]; //PSEUDO-CODE
}
}
public class SmartForms
{
private string _loadCode;
public List<SmartForm> _collection = new List<SmartForm>();
public List<SmartForm> Collection
{
get
{
return _collection;
}
}
public SmartForms(string loadCode)
{
_loadCode = loadCode;
Load();
}
//fills internal collection from data source, based on "load code"
private void Load()
{
switch (_loadCode)
{
case "all":
SmartForm smartFormA = new SmartForm { IdCode = "customerMain", Title = "Customer Main" };
SmartForm smartFormB = new SmartForm { IdCode = "customerMain2", Title = "Customer Main2" };
SmartForm smartFormC = new SmartForm { IdCode = "customerMain3", Title = "Customer Main3" };
_collection.Add(smartFormA);
_collection.Add(smartFormB);
_collection.Add(smartFormC);
break;
case "id = 34":
SmartForm smartForm2 = new SmartForm { IdCode = "customerMain2", Title = "Customer Main2" };
_collection.Add(smartForm2);
break;
default:
break;
}
}
}
}
解決
まったく同じオブジェクトである必要はありません、それだけで、外部の観察者に同じように見える必要があります。あなたが別のオブジェクトからすべてのデータをコピーする場合、それは同じことを実現します。
public SmartForm(string loadCode)
{
_loadCode = loadCode;
SmartForms smartForms = new SmartForms(_loadCode);
this.IdCode = smartForms[0].IdCode;
this.Title = smartForms[0].Title;
}
他のヒント
ことはできません一のオブジェクトになります。
使用における静的メソッドの代わりにコンストラクタ(および、コンストラクタプライベート/内/なだけのstaticメソッドにアクセスできました。数多くの特典を利用静的手法のコンストラクタ:
- できる場合にはnullを返します適切な
- に戻すことができ、既存のオブジェクトが適切な
- いたっぷりの仕事 その 電話の簡易コンストラクタで設定分野
温水、水共に弱い作業C#ンコレクション/オブジェクトinitializers:(
代替における静的メソッド(あるいは、依存関係を注射、確かは別の工場とコンスタンス方法。
あなたがすることはできません。マイクロソフトは、パブリック静的ではなく、()メソッドを作成して定義することによってこれを行います。 System.Net名前空間の例WebRequestクラスおよびHttpWebRequestのために参照してください。私はあなたが同じことをお勧めします。
基底クラスのコンストラクタは、内部またはプライベート作り、それを直接インスタンス化することはできません。いっそ、その抽象クラスします。あなたの作成します()の実装に隠されたコンストラクタを使用してください。
あなたは代わりにinternal
の、コンストラクタのためprotected
またはpublic
修飾子を使用することができます。このようなこと:
public SmartForm() {}
public SmartForm(string loadCode)
{
_loadCode = loadCode;
SmartForms smartForms = new SmartForms(_loadCode);
//this = smartForms.Collection[0]; //PSEUDO-CODE
}
となります:
internal SmartForm() {}
internal SmartForm(string loadCode)
{
_loadCode = loadCode;
SmartForms smartForms = new SmartForms(_loadCode);
//this = smartForms.Collection[0]; //PSEUDO-CODE
}
あなたはSmartFormData
と呼ばれるプライベートクラスを作り、その中にすべての値を入れることができます。
SmartForms
複数のクラスは、それらのオブジェクトのコレクションを維持し、SmartForm
単数コンストラクタはSmartForms
複数で右SmartFormDataインスタンスを見つけ作る確認します。
次に、SmartForm
単数形のプロパティのすべてがSmartFormData
から値を取得します。
しかし、それを行うための最善の方法は、プライベートコンストラクタを持っているし、ファクトリメソッドを使用することです。
あなたはコンストラクタを使用する必要があります理由はありますか?