[英]How do i extend a property through inheritance?
我有一類產品,其中包含帶有價格曲線的字典。 密鑰是可以解析為時間戳的字符串。
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>>();
}
}
我不確定這是否是此案的好方法。 我還想將枚舉類型限制為十進制。 有任何想法嗎?
更新:我忘了提到我需要將所有產品保存為通用列表(列表)
這隱藏了一個成員。
多態是指更改方法,在某些子類中實現屬性,例如將其稱為“派生”或“繼承”類。 但是,無論如何,它的簽名是不可變的。
C#提供了一種隱藏成員的好方法:“ new”關鍵字。
您只需要在派生類的access修飾符之前添加“ 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>>();
如果我沒看錯,這就是您要解決的問題;)
編輯:對不起,我忘了更改您的基類中的某些內容,再次檢查此答案:)
我會簡化一下,因為此代碼具有一定的不良氣味。
你為什么不使用PriceList
在SpecialProduct
內Product
為好,使子字典只有一個值始終PriceType.Default
或類似的東西? 這樣,您便可以使用所有Products
而無需進行任何強制檢查或檢查。
那這種方法呢?
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>>
{
...
}
也許這更適合您的要求。
問候
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.