我有一个继承通用字典和接口的类
public class MyDictionary: Dictionary<string, IFoo>, IMyDictionary
{
}
问题是这个类的消费者正在寻找界面的'.Keys'和“.Values”属性,所以我补充说:
/// <summary>
///
/// </summary>
ICollection<string> Keys { get; }
/// <summary>
///
/// </summary>
IEnumerable<IFoo> Values { get; }
到界面。
现在,实现也需要这个,但是当我实现这些时,我得到了这个错误:
“关键字new是必需的,因为它隐藏了属性键......”
所以我需要做什么。我应该在这些获取属性前添加“新”吗?
答案 0 :(得分:6)
另一种选择是将界面上的类型更改为:
public interface IMyDictionary
{
/// <summary>
///
/// </summary>
Dictionary<string, IFoo>.KeyCollection Keys { get; }
/// <summary>
///
/// </summary>
Dictionary<string, IFoo>.ValueCollection Values { get; }
}
这样,界面已经由字典实现,省去了再次实现属性的麻烦,并且它不会隐藏或覆盖原始实现。
答案 1 :(得分:4)
Dictionary&lt; string,IFoo&gt;实现IDictionary&lt; TKey,TValue&gt;已提供Keys和Values属性的接口。不需要创建自己的属性,但绕过编译器警告的方法是在类的属性声明的开头添加new
关键字。
答案 2 :(得分: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。
答案 3 :(得分: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; }
}
}