类继承泛型字典<string,ifoo =“”>和接口</string,>

时间:2008-11-30 11:45:22

标签: c# generics collections interface

我有一个继承通用字典和接口的类

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

问题是这个类的消费者正在寻找界面的'.Keys'和“.Values”属性,所以我补充说:

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

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

到界面。

现在,实现也需要这个,但是当我实现这些时,我得到了这个错误:

“关键字new是必需的,因为它隐藏了属性键......”

所以我需要做什么。我应该在这些获取属性前添加“新”吗?

4 个答案:

答案 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; }
    }
}