我如何通过继承扩展属性?

时间:2011-03-08 08:49:08

标签: c# inheritance enums properties constraints

我有一个产品类,其中包含带有价格曲线的字典。键是一个可以解析为TimeStamp的字符串。

public class Product
{
    public virtual int Id { get; set; }
    public virtual IDictionary<string, decimal> PriceList { get; set; }

    public Product()
    {
        this.PriceList = new Dictionary<string, decimal>();
    }
}

现在我需要第二堂课,每门钥匙的价格更高

public class SpecialProduct : Product
{
    public enum PriceType
    {
        BusineesDays,
        Weekends,
        Holidays
    }

    public virtual IDictionary<string, IDictionary<PriceType, decimal>> PriceList { get; set; }

    public SpecialProduct()
    {
        this.PriceList = new Dictionary<string, IDictionary<PriceType, decimal>>();
    }
}

我不确定这是否适合这种情况。我还想将枚举类型约束为十进制。有什么想法吗?

更新:我忘了提到我需要将所有产品保存为通用列表(列表)

3 个答案:

答案 0 :(得分:1)

这隐藏了一名成员。

多态性是指在某些子类中更改方法,属性实现,比如说“派生”或“继承”类。但是,无论如何,它的签名是不可改变的。

C#提供了隐藏成员的好方法:“新”关键字。

你只需要在派生类中的访问修饰符之前加上“new”就可以了。如果你不这样做,C#编译器会建议你这样做。

顺便说一句,如果您的目标是使用多态,那么您应该考虑使用泛型。

您的基类应该有一个“TPriceValue”泛型参数,它看起来像这样:

public class Product<TPriceValue>
{
    public virtual int Id { get; set; }
    public virtual TPriceValue PriceList { get; set; }

    public Product()
    {
        // NOTE/EDIT: You wouldn't initialize "PriceList" here...
    }
}

因此,如果您希望您的价格值为小数,则应以这种方式实例化您的类:

new Product<decimal>();

或者,如果你想把你的价值作为另一个字典:

new Product<IDictionary<PriceType, decimal>>();

如果我没错,这就是你的情况;)

编辑:对不起,我忘记更改基类中的内容,再次检查此答案:)

答案 1 :(得分:0)

我会去简化,因为这段代码有一些难闻的气味。

为什么不使用PriceList内的SpecialProduct中的Product,并使子字典只有一个PriceType.Default或类似的值那?然后,您可以使用所有Products而无需任何演员表或支票。

答案 2 :(得分:0)

这种做法怎么样?


public abstract class AProductBase<T>
{
  public IDictionary<string, T> PriceList { get; set; }
  ...
}

public class Product : AProductBase<decimal>
{
  ...
}

public enum PriceTypeEnum { ... }

public class SpecialProduct : AProductBase<IDictionary<PriceTypeEnum, decimal>>
{
  ...
}

也许这更符合您的要求。

此致