在.NET Framework 3.5(C#3.0)中,为什么System.Hashtable
在已经实现继承这两个接口的ICollection
时实现IEnumerable
和IDictionary
?
答案 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
here和here中的两个实现。
新修改:
实际上,如果您检查源代码(例如找到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的回答和相关的答案都是正确的,而我的回答有点偏离主题。我会留下这篇文章供其他人学习,即使它与提出的问题没有严格的关系。