程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則20:明辨接口實現和虛函數重載的區別(1)

Effective C#原則20:明辨接口實現和虛函數重載的區別(1)

編輯:關於C語言

粗略的看一下,感覺實現接口和虛函數重載是一樣的。你定義了一些對象, 但是這些對象是在另一個類型裡申明的。你被第一感覺騙了,實現接口與虛函數 重載是完全不同的。在接口裡定義的成員默認情況下,是根本不存在實際內容的 。

派生類不能重載基類中的接口成員。接口可以隱式的實現,就是把它 們從類的公共接口中隱藏。它們的概念是不同的而且使用也是不同的。

但你可以這樣的實現接口:讓你的派生類可以修改你的實現。你只用對派生類做 一個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" );
 }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved