我有两个类:Purchase
(父级)和DiscountPurchase
(子级,带有一个附加字段“ discount”)。每个都有2个构造函数(带有和不带有参数)。我需要解析字符串并创建实例之一。我知道,我可以这样:
string[] parameters = csvString.Split(';');
string productName = parameters[0];
decimal cost = decimal.Parse(parameters[1]);
int productCount = int.Parse(parameters[2]);
if (parameters.Length < 4)
{
newPurchase = new Purchase(productName, cost, productCount);
}
else
{
decimal discount = decimal.Parse(parameters[3]);
newPurchase = new FixedDiscountPurchase(productName, cost, productCount, discount);
}
但是也许有一种更优雅的方式:反射还是其他?
最佳答案
这是工厂模式的典型用例。您知道,您需要Purchase
的实例-但您不知道确切的子类型。 (有关更复杂和有用的示例,请参见http://www.dotnetperls.com/factory和此处:http://msdn.microsoft.com/en-us/library/orm-9780596527730-01-05.aspx)
Ofc。这并不能避免您已经实施的逻辑-它可以帮助您不必一遍又一遍地重复自己,并且将逻辑封装在一个工厂中,您可以随时在任何地方使用。
以您的示例为例,一个简单的工厂可能看起来像这样:
static class PurchaseFactory
{
public Static Purchase BuildPurchase(String[] parameters){
string productName = parameters[0];
decimal cost = decimal.Parse(parameters[1]);
int productCount = int.Parse(parameters[2]);
if (parameters.Length < 4)
{
return new Purchase(productName, cost, productCount);
}
else
{
decimal discount = decimal.Parse(parameters[3]);
return new FixedDiscountPurchase(productName, cost, productCount, discount);
}
}
}
因此,在代码中的任何地方,您只需要:
string[] parameters = csvString.Split(';');
Purchase p = PurchaseFactory.BuildPurchase(parameters);
//p is now either "Purchase" or "FixedDiscountPurchase"
好吧,如果只是这两个类,并且希望知道价格是否打折(并计算最终价格),那么您可以摆脱一个包含折扣标志和方法的
Purchase
类在任何情况下的FinalPrice:public class Purchase
{
public Decimal Discount { get; set; }
public Boolean Discounted { get; set; }
public String Name { get; set; }
public Decimal Price { get; set; }
public Int32 Count { get; set; }
public Decimal FinalPrice
{
get
{
if (!Discounted)
return Price;
else
return Price - Discount;
}
}
public Purchase (String csvString){
string[] parameters = csvString.Split(';');
Name = parameters[0];
Price = decimal.Parse(parameters[1]);
Count = int.Parse(parameters[2]);
if (parameters.Length == 4)
{
Discount = decimal.Parse(parameters[3]);
Discounted = true;
}
}
}
用法:
Purchase p = new Purchase(stringInput);
MessageBox.Show(p.FinalPrice.ToString());
只要确保参考
purchase.FinalPrice
,就不必担心价格是否实际打折了。关于c# - 选择合适的构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27156376/