在尝试覆盖来自Collection<T>
类的ICollection<T>.IsReadOnly
属性的显式接口实现时,我遇到了一些文档,指出显式接口成员实现不能被覆盖,因为它们不能具有virtual
或abstract
等修饰符。在MSDN上,它们甚至指定如何通过创建另一个由显式接口成员实现调用的抽象或虚拟成员来使显式接口成员实现可用于继承。到目前为止还没有问题。
但随后我想知道:为什么在C#中可以仅通过指定接口显式实现的接口成员
例如,假设我有一个简单的接口,如下所示,具有属性和方法:
public interface IMyInterface
{
bool AlwaysFalse { get; }
bool IsTrue(bool value);
}
还有一个显式实现接口的类A
,它有一个方法Test()
,它调用自己的接口成员实现。
public class A : IMyInterface
{
bool IMyInterface.AlwaysFalse
{ get { return false; } }
bool IMyInterface.IsTrue(bool value)
{ return value; }
public bool Test()
{ return ((IMyInterface)this).AlwaysFalse; }
}
正如您所看到的,四个成员都不是虚拟的或抽象的,所以当我像这样定义一个类B
时:
public class B : A
{
public bool AlwaysFalse
{ get { return true; } }
public bool IsTrue(bool value)
{ return !value; }
}
然后,您会期望将B
强制转换为A
的实例的行为类似于A
。它确实做到了:
A a = new A();
Console.WriteLine(((IMyInterface)a).AlwaysFalse); // False
Console.WriteLine(((IMyInterface)a).IsTrue(false)); // False
Console.WriteLine(a.Test()); // False
A b = new B();
Console.WriteLine(((IMyInterface)b).AlwaysFalse); // False
Console.WriteLine(((IMyInterface)b).IsTrue(false)); // False
Console.WriteLine(b.Test()); // False
现在问题来了。创建一个与B
完全相同的类C
,除了类声明中的一件事:
public class C : A, IMyInterface
{ /* ... same as B ... */ }
现在,当强制转换为A
时,C
的一个实例的行为不像A
,而像C
A c = new C();
Console.WriteLine(((IMyInterface)c).AlwaysFalse); // True
Console.WriteLine(((IMyInterface)c).IsTrue(false)); // True
Console.WriteLine(c.Test()); // True
现在,在C
中甚至连Test()
方法都会调用被覆盖的方法!为什么会这样呢?
https://stackoverflow.com/questions/3705308
复制相似问题