尝试重写的显式接口实现时,
ICollection<T>.IsReadOnly
属性来自
Collection<T>
类,我遇到一些文档,这些文档声明不能重写显式接口成员实现,因为它们不能有修饰符,例如
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; }
}
那么你会期待一个
乙
强制转换为
一
表现得像
一
. 它做到了:
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
现在,接球来了。创建一个类
C
哪一个是
乙
除了类声明中的一件事:
public class C : A, IMyInterface
{ /* ... same as B ... */ }
现在是
C
,当强制转换为
一
,行为不象
一
但就像
C
:
A c = new C();
Console.WriteLine(((IMyInterface)c).AlwaysFalse); // True
Console.WriteLine(((IMyInterface)c).IsTrue(false)); // True
Console.WriteLine(c.Test()); // True
即使是
测试()
方法现在调用重写的方法
C
!这是为什么?