[英]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.