簡體   English   中英

如何通過繼承擴展屬性?

[英]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>>();

如果我沒看錯,這就是您要解決的問題;)

編輯:對不起,我忘了更改您的基類中的某些內容,再次檢查此答案:)

我會簡化一下,因為此代碼具有一定的不良氣味。

你為什么不使用PriceListSpecialProductProduct為好,使子字典只有一個值始終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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM