为什么Hashtable实现了ICollection和IEnumerable?

时间:2014-03-06 12:58:53

标签: c# .net interface hashtable

在.NET Framework 3.5(C#3.0)中,为什么System.Hashtable在已经实现继承这两个接口的ICollection时实现IEnumerableIDictionary

2 个答案:

答案 0 :(得分:2)

有这些接口:

interface IFoo1 {...}

interface IFoo2: IFoo1{...}

以下编辑方面没有区别:

class MyClass: IFoo2{...}

class MyClass: IFoo2, IFoo1{...}

第二个声明使开发人员更清楚MyClass类实现的所有接口。因此,更容易看一下文档,看看MyClass实现了IFoo1接口,而没有深入研究IFoo2接口。

答案 1 :(得分:0)

由于Hashtable的直接基类是System.Object,它不实现接口,接口重新实现在这里无关紧要。

由于IDictionary未隐藏从IEnumerable继承的任何成员(例如,它未声明new方法GetEnumerator()),因此具有相同名称的成员的实施也不是原因。

由于“通常”原因都不适用,我认为Hashtable无特殊原因实现这两个原因。

修改:

不确定这是否是答案。

以上陈述实际上是错误的。非通用IDictionary类型 会隐藏 成员(重载)GetEnumerator(),它从其基本接口之一继承(非泛型) IEnuemrable。但不确定这是否相关。请参阅Hashtable herehere中的两个实现。

新修改:

实际上,如果您检查源代码(例如找到here),您只会看到:

public class Hashtable : IDictionary, ISerializable, IDeserializationCallback, ICloneable

但正如在an answer中编写的线程已经由Henrik的注释链接,在编译的IL中,所有基接口仍然是显式列出的。因此,从编译程序集中的IL到伪C#的反编译器无法区分。


最终补充:

我真的试图提出一个涉及接口重新实现的案例,如果你同时给出了已经指定的派生接口的基本接口,那也很重要,但我认为不存在。这是我的尝试:

interface IBase
{
    int Member { get; }
}
interface IDerived : IBase
{
}

class Animal : IBase
{
    int IBase.Member
    {
        get { return 10; }
    }
}
class Elephant : Animal, IDerived  // try ": Animal, IBase, IDerived"        ...        ...        ...        also try ": Animal, IBase"; try ": Animal"
{
    public int Member
    {
        get { return 20; }
    }
}

static class Test
{
    static void Main()
    {
        IBase elephantAsIBase = new Elephant();
        int readMember = elephantAsIBase.Member;
        Console.WriteLine(readMember);
    }
}

但事实证明不是一个例子。即使只为IDerived指定了Elephant,也会重新实现所有接口,包括IBase。仅当Elephant既未指定IDerived也未指定IBase时,才会重新实施。

所以Mert的回答和相关的答案都是正确的,而我的回答有点偏离主题。我会留下这篇文章供其他人学习,即使它与提出的问题没有严格的关系。