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