我有两个类: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/

10-10 21:27