雖然試圖覆蓋屬性的顯式接口實現類,但我發現一些文檔指出顯式接口成員實現不能被覆蓋,因爲它們不能被修飾符,如virtual
或abstract
。在MSDN上,他們甚至會指定如何通過創建由顯式接口成員實現調用的另一個抽象或虛擬成員來使顯式接口成員實現可用於繼承。目前沒有問題。C#:通過明確指定接口覆蓋屬性
但後來我想:爲什麼有可能在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
現在來抓住。創建一個類C
這是B
的精確副本,除了在類聲明一兩件事:
public class C : A, IMyInterface
{ /* ... same as B ... */ }
現在實例的C
,轉換爲A
時不會表現得像A
但像C
:
A c = new C();
Console.WriteLine(((IMyInterface)c).AlwaysFalse); // True
Console.WriteLine(((IMyInterface)c).IsTrue(false)); // True
Console.WriteLine(c.Test()); // True
即使Test()
方法現在調用C
中的重寫方法!爲什麼是這樣?
非常有趣的問題! – 2010-09-14 09:00:42