2008-11-30 48 views
2

我有一個繼承通用字典和inteface類類繼承了通用字典<字符串的IFoo>和接口

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

的問題是,這一類的消費者正在尋找」 .Keys'和「接口」屬性的接口,所以我補充說:

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

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

到接口。現在

,實施需要有這個問題,以及但是,當我實現這些,我得到這個錯誤:

「 new關鍵字,是因爲它隱藏屬性Keys需要。」

等什麼我需要做什麼。我應該在這些獲取屬性前添加一個「新」嗎?

回答

5

另一種辦法是改變接口的類型是:

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

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

這樣的接口已經由字典節省您再次實現性能的麻煩來實現,它不隱藏或覆蓋原始實施。

2

原因是您的鍵和值屬性隱藏了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,但是。

+0

你能給我一個代碼示例嗎? – leora 2008-11-30 12:03:48

+0

我正在處理它。 – 2008-11-30 12:04:54

4

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

2

您也可以使用顯式接口實現。這樣,如果有人通過使用接口IMyDictionary引用MyDictionary,他們將看到方法,而不是別的。我也建議實施IDictionary。除非你想限制使用只是鍵和值。

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

    IEnumerable<IFoo> IMyDictionary.Values 
    { 
     get { return Values; } 
    } 
} 
相關問題