class Program { static void Main(string[] args) { var cg = new Greeting(); var chinese = (ChineseGreeting)cg; //你好 chinese.Hello(); var english = (EnglishGreeting)cg; //你好 english.Hello(); Console.ReadKey(); } } public interface ChineseGreeting { void Hello(); } public interface EnglishGreeting { void Hello(); } public class Greeting : ChineseGreeting, EnglishGreeting { //隱式介面實現導致方法只有一次實現機會 //兩個介面的Hello將會有相同的行為 public void Hello() { Console.Write("你好!"); } }為了區別開不同介面相同方法的實現,我們可以使用顯式介面實現:
public class Greeting : ChineseGreeting, EnglishGreeting { //顯式介面實現 void ChineseGreeting.Hello() { Console.Write("你好!"); } void EnglishGreeting.Hello() { Console.Write("Hello!"); } }用的方式是相同的。在使用顯式介面實現之後,必須將物件轉化為介面型別才可以存取它。因為顯式介面實現的方法預設是介面型別私有的(也不能使用存取修飾符),而且是 sealed。
//繼承類不存在此方法,顯式介面實現方法歸介面私有
cg.Hello();
int 1=1;
//由於 ToSingle 是顯式介面實現,所以必須先轉化為介面基本類型
var s = ((IConvertible) i).ToSingle(null);
float IConvertible.ToSingle(IFormatProvider provider);
ToSingle 簽名包含了介面型別 IConvertible,說明了 ToSingle 方法使用了顯式介面實現。public class People : IComparable { public string name { get; set; } public int age { get; set; } //型別安全的CompareTo方法 public int CompareTo(People p) { return p.age >= age ? 1 : -1; } //為了實現ICompareable,不得不顯示介面實現 int IComparable.CompareTo(object obj) { //obj轉化為People型別可能會出現問題 return CompareTo((People)obj); } }上面的型別中,通過比較年齡來比較 People 類的大小。在接受 object 為引數的 CompareTo 方法中,必須強制將 obj 轉化為 People 類,而這是型別不安全的。
People p = new People();
People q = new People();
q.CompareTo(p);
//如果物件是 People 型別,存取不到顯式介面實現的 CompareTo 方法
//也就不能傳入任意型別
q.CompareTo(i); //不能通過編譯!
//但是可以通過將型別轉化為介面基本類型
//存取到顯式介面實現的 CompareTo 方法,傳入任意型別
//於是再次失去型別安全性
var q2 = (IComparable) q;
q2.CompareTo(i); //可以通過編譯!
public class People : IComparable<People> { public string name { get; set; } public int age { get; set; } //型別安全的CompareTo方法 public int CompareTo(People p) { return p.age >= age ? 1 : -1; } }繼承 IComparable<T> 使得我們不需要再寫一個輸入引數為 object 的 CompareTo 方法,它絕對保證型別安全,而且,由於沒有型別轉換,也就不存在裝箱。