[英]How can I force a C# constructor to be a factory?
下面的代碼包含兩個類 :
我希望能夠實例化這樣的單數和復數類(即我不想工廠方法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;
}
}
}
}
您無法讓一個對象“成為”另一個對象。
使用靜態方法而不是構造函數(並使構造函數私有/內部/任何形式,以便只有靜態方法才能訪問它們)。 在構造函數上使用靜態方法有很多好處:
缺點是它們不適用於C#集合/對象初始值設定項:(
靜態方法的一種替代方法(誠然,它不能很好地與依賴項注入配合使用)是擁有一個單獨的工廠並在其上調用實例方法。
它不必是完全相同的對象,它只需要看起來對外部觀察者是相同的即可。 如果將所有數據從一個對象復制到另一個對象,它將完成同一件事。
public SmartForm(string loadCode)
{
_loadCode = loadCode;
SmartForms smartForms = new SmartForms(_loadCode);
this.IdCode = smartForms[0].IdCode;
this.Title = smartForms[0].Title;
}
你不能。 Microsoft通過定義一個公共的靜態Create()方法來做到這一點。 例如,請參閱System.Net命名空間中的WebRequest和HttpWebRequest。 我建議你這樣做。
將基類的構造函數設置為內部或私有,因此無法直接實例化。 或更妙的是,使其成為抽象類。 在Create()實現中使用隱藏的構造函數。
您可以為構造器使用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
所有屬性SmartForm
奇異,以從SmartFormData
獲取它們的值。
但是,最好的方法是擁有私有構造函數並使用工廠方法。
是否有理由必須使用構造函數?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.