Mor*_*eng 16 c# inheritance explicit implicit
今天我碰巧发现一个C#类可以以隐式和显式方式继承一个接口.这让我感到惊讶.如果C#以这种方式工作,那么当以不同方式引用时,一个实例的行为会有所不同.
interface IFoo
{
void DoSomething();
}
class Foo : IFoo
{
#region IFoo Members
public void DoSomething()
{
Console.WriteLine("do something implicitly");
}
#endregion
#region IFoo Members
void IFoo.DoSomething()
{
Console.WriteLine("do something explicitly");
}
#endregion
}
Foo f = new Foo();
f.DoSomething();
((IFoo)f).DoSomething();
Run Code Online (Sandbox Code Playgroud)
上面的代码运行和输出
do something implicitly
do something explicitly
Run Code Online (Sandbox Code Playgroud)
我相信这种C#设计会使行为不一致.也许强制一个C#类可以以隐式或expliict方式从一个接口继承,但不能同时从两个接口继承.
有没有理由为什么C#以这种方式设计?
Mar*_*ade 13
实现接口的每个类都具有该类成员与接口成员之间的映射.如果类显式实现了接口成员,那么显式实现将始终映射到接口.如果没有显式实现,则需要隐式实现,并且该实现将映射到接口.
当一个类具有相同的会员名称和相关类型的接口,但它也明确地实现了该接口的相应成员,则类的"隐性"的实施不考虑接口的实现在所有的(除非显式实现通话它).
除了在每种情况下类具有相同成员名称/类型的多个接口的不同含义之外,即使只有一个接口,该类本身也被认为具有隐式接口,该接口可能具有与唯一接口相同的成员/类型但仍然意味着不同的东西.
Hal*_*rim 11
您的例子并不能既含蓄,并明确实施的IFoo.您只能显式实现IFoo.DoSometing().您的类上有一个名为DoSomething()的新方法.它与IFoo.DoSomething无关,只是它具有相同的名称和参数.
这使得它在发生碰撞时更加灵活.特别是,看看IEnumerator和IEnumerator<T>- 他们都有一个Current属性,但有不同的类型.您必须使用显式接口实现才能实现这两者(并且泛型形式扩展了非泛型形式).