我怎么能力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;
}
其他提示
你不能得到一个对象"成为"另一个。
使用静态的方法,而不是构造(和使造私人/内部/管如此,只有静态的方法可以访问)。有许多好处,以使用的是静态的方法,超过构造:
- 你可以返回空,如果合适
- 你可以返回的一个现有的对象,如果合适
- 你可以做大量的工作, 然后 呼叫一个简单的构造,只是集领域
缺点是他们不工作C#收对象的初始:(
一种替代以静态的方法(其中不工作,以及与依赖注射,不可否认)是有一个单独的工厂,并呼吁实例的方法。
您不能。Microsoft会通过界定公共静Create()方法来代替。例如,见问福汇,他们说和HttpWebRequest在System.Net 名字空间。我建议你也这样做。
使基类的构造内部的或是私人的,所以它不能直接实例化。或者更好,使它成为一个抽象的类。使用的隐藏的构造你的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
奇异构造找到正确的SmartFormData实例 SmartForms
复数。
然后,使所有的属性 SmartForm
奇取回他们的价值观从 SmartFormData
然而,最好的方式做到这一点是有私人的构造和使用工厂的方法。
还有一个原因,你必须使用一种构造?