簡體   English   中英

類繼承了通用字典 <string, IFoo> 和界面

[英]Class inherits generic dictionary<string, IFoo> and Interface

我有一個繼承通用字典和接口的類

public class MyDictionary: Dictionary<string, IFoo>, IMyDictionary
{
}

問題是這個類的消費者正在尋找界面的'.Keys'和“.Values”屬性,所以我補充說:

    /// <summary>
    /// 
    /// </summary>
    ICollection<string> Keys { get; }

    /// <summary>
    /// 
    /// </summary>
    IEnumerable<IFoo> Values { get; }

到界面。

現在,實現需要也有這個,但是當我實現這些時,我得到這個錯誤:

“關鍵字new是必需的,因為它隱藏了屬性鍵......”

所以我需要做什么。 我應該在這些獲取屬性前添加“新”嗎?

另一種選擇是將接口上的類型更改為:

public interface IMyDictionary
{
    /// <summary>
    /// 
    /// </summary>
    Dictionary<string, IFoo>.KeyCollection Keys { get; }

    /// <summary>
    /// 
    /// </summary>
    Dictionary<string, IFoo>.ValueCollection Values { get; }
}

這樣,接口已經由字典實現,省去了再次實現屬性的麻煩,並且它不會隱藏或覆蓋原始實現。

Dictionary <string,IFoo>實現IDictionary <TKey,TValue>接口,該接口已提供Keys和Values屬性。 不需要創建自己的屬性,但繞過編譯器警告的方法是在類的屬性聲明的開頭添加new關鍵字。

原因是您的鍵和值屬性隱藏了Dictionary類中鍵和值屬性的實現。

編輯:是的,您所要做的就是將新關鍵字添加到您的屬性中。 所以你的代碼看起來像這樣:

class IFoo
{ }

interface MyDictionary
{
    ICollection<string> Keys { get; }

    /// <summary>
    /// 
    /// </summary>
    IEnumerable<IFoo> Values { get; }
}

class IStuff : Dictionary<string, IFoo>, MyDictionary
{
    #region MyDictionary Members

    //Note the new keyword.
    public new ICollection<string> Keys
    {
        get { throw new NotImplementedException(); }
    }

    public new IEnumerable<IFoo> Values
    {
        get { throw new NotImplementedException(); }
    }

    #endregion
}

我仍然建議實現IDictionary。

您還可以使用顯式接口實現。 這樣,如果有人通過使用IMyDictionary接口引用MyDictionary,他們將看到方法,而不是其他任何東西。 我還建議改為實現IDictionary。 除非您想將使用限制為僅鍵和值。

public class MyDictionary : Dictionary<string, IFoo>, IMyDictionary
{
    ICollection<string> IMyDictionary.Keys
    {
        get { return Keys; }
    }

    IEnumerable<IFoo> IMyDictionary.Values
    {
        get { return Values; }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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