粗略的看一下,感覺實現接口和虛函數重載是一樣的。你定義了一些對象, 但是這些對象是在另一個類型裡申明的。你被第一感覺騙了,實現接口與虛函數 重載是完全不同的。在接口裡定義的成員默認情況下,是根本不存在實際內容的 。
派生類不能重載基類中的接口成員。接口可以隱式的實現,就是把它 們從類的公共接口中隱藏。它們的概念是不同的而且使用也是不同的。
但你可以這樣的實現接口:讓你的派生類可以修改你的實現。你只用對派生類做 一個Hook就行了。(譯注:相信寫過C++程序的人就知道hook是什麼意思,而且我 也實在想不到把hook譯成什麼比較好,所以就直接用hook這個原詞了,就像bug 一樣。)
為了展示它們的不同之處,試著做一個簡單的接口以及在一個類 中實現它:
interface IMsg
{
void Message();
}
public class MyClass : IMsg
{
public void Message()
{
Console.WriteLine( "MyClass" );
}
}
Message()方法是MyClass的公共接口, Message同樣可以用一個接口指針IMsg來訪問。現在讓我們來一點繁雜的,添加 一個派生類:
public class MyDerivedClass : MyClass
{
public new void Message()
{
Console.WriteLine( "MyDerivedClass" );
}
}
注意到,我添加了一個關鍵字new在Message方法上,用於區別前 面的一個Message(參見原則29)。MyClass.Message()不是虛函數,派生類可以不 提供重載版本。MyDerived類創建了一個新的Message方法,但這個方法並不是重 載MyClass.Message:它隱藏了原來的方法。而且,MyClass.Message還是可以通 過IMsg的引用來訪問:
MyDerivedClass d = new MyDerivedClass( );
d.Message( ); // prints "MyDerivedClass".
IMsg m = d as IMsg;
m.Message( ); // prints "MyClass"
接口方法不是虛的,當你實 現一個接口時,你就要在詳細的相關類型中申明具體的實現內容。
但你 可能想要創建接口,在基類中實現這些接口而且在派生類中修改它們的行為。這 是可以辦法到的。你有兩個選擇,如果不訪問基類,你可以在派生類中重新實現 這個接口:
public class MyDerivedClass : MyClass, IMsg
{
public new void Message()
{
Console.WriteLine( "MyDerivedClass" );
}
}