我有一个产品类,其中包含带有价格曲线的字典。键是一个可以解析为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>>();
}
}
我不确定这是否适合这种情况。我还想将枚举类型约束为十进制。有什么想法吗?
更新:我忘了提到我需要将所有产品保存为通用列表(列表)
答案 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>>
{
...
}
也许这更符合您的要求。
此致