摘自:http://www.cnblogs.com/zhangronghua/archive/2009/11/25/1610713.html
一般來說.NET提供了三種不同的接口實現方式,分別為隱式接口實現、顯式接口實現、混合式接口實現。這三種方式各有各的特點。
首先來看隱式接口實現,這恐怕是我們使用最多的一種接口實現,因為隱匿接口實現是.NET的默認接口實現方式。下面讓我們來看一個隱式接口實現的例子:
using System; internal class MyClass { public void SomeMethod() { // 利用接口的方式聲明一個Myinplement對象 IMyInterface iObj = new MyInplement(); iObj.MethodA(); // 利用類的方式聲明一個Myinplement對象 MyInplement obj = new MyInplement(); obj.MethodB(); } } public class MyInplement : IMyInterface { #region IMyInterface Members /// <summary> /// 利用隱式接口實現方式實現接口中的方法 /// </summary> public void MethodA() { Console.WriteLine("a"); } /// <summary> /// 利用隱式接口實現方式實現接口中的方法 /// </summary> public void MethodB() { Console.WriteLine("B"); } #endregion } public interface IMyInterface { void MethodA(); void MethodB(); }
上面的代碼很簡單,我們聲明了一個接口,然后利用MyImplement類來實現接口。在實現接口的時候我們選擇了隱式接口實現,即在接口中定義的方法簽名前加上修飾符來定義實現方法的簽名,比如public voidMethodB()。這種隱式接口實現用起來很簡單,但卻有一個缺點,就是它允許客戶可以直接調用實現類中的方法,(即通過MyInplementobj = newMyInplement()這樣的方式聲明對象)而不是通過接口調用實現類中的方法(即通過的IMyInterface iObj = new MyInplement();方式來聲明對象),這無疑增加了代碼的耦合性和違反了面向接口編程的原則。那怎么樣才能禁止客戶直接調用實現類呢? 下面我們看的顯式接口實現就可以。
顯式接口實現是指實現類在實現接口的方法時在方法的簽名上用"接口名.方法名”的樣式來定義方法名,同時在方法的簽名中不允許帶有修飾符,因為所有顯式接口實現的方法全是private的,這是.NET為了禁止客戶直接調用實現類而硬性規定的。下面我們來看顯式接口實現的例子:
using System; internal class MyClass { public void SomeMethod() { // 利用接口的方式聲明一個Myinplement對象 IMyInterface iObj = new MyInplement(); iObj.MethodA(); // 利用類的方式聲明一個Myinplement對象,會報錯,因為MyImplement的MethodA方法是private的 MyInplement obj = new MyInplement(); obj.MethodB(); } } public class MyInplement : IMyInterface { #region IMyInterface Members /// <summary> /// 利用顯式接口實現方式實現接口中的方法 /// </summary> void IMyInterface.MethodA() { Console.WriteLine("a"); } /// <summary> /// 利用顯式接口實現方式實現接口中的方法 /// 會報錯,因為在顯式接口實現時不允許帶有修飾符 /// </summary> public void IMyInterface.MethodB() { Console.WriteLine("B"); } #endregion } public interface IMyInterface { void MethodA(); void MethodB(); }
上面的代碼中有兩個地方會報錯,這是因為我們在報錯的地方違反了顯式接口實現的約束。
最后讓我們來看混合式接口實現,混合式接口實現就是將隱式接口實現和顯式接口實現搭在一起使用,下面讓我們來看一個例子:
using System; internal class MyClass { public void SomeMethod() { // 利用接口的方式聲明一個Myinplement對象 IMyInterface iObj = new MyInplement(); iObj.MethodA(); // 利用類的方式聲明一個Myinplement對象,不會報錯,因為MyImplement的MethodA方法是public的 MyInplement obj = new MyInplement(); obj.MethodB(); } } public class MyInplement : IMyInterface { #region IMyInterface Members /// <summary> /// 利用顯式接口實現方式實現接口中的方法 /// </summary> void IMyInterface.MethodA() { Console.WriteLine("a"); } /// <summary> /// 利用隱式接口實現方式實現接口中的方法 /// </summary> public void MethodB() { Console.WriteLine("B"); } #endregion } public interface IMyInterface { void MethodA(); void MethodB(); }
上面的代碼中我們將MehtodB的實現改為隱式接口實現,這樣MyImplement.Method的修飾符就是public的了,代碼中就沒有錯了。
通過簡單的代碼示例看到了三種接口實現方式的區別,話說在今天之前我一直沒有注意到隱式接口實現可以允許實現類直接被調用,而顯式接口實現由于實現類中的方法是私有的所以不能被直接調用。看來我對.NET的認識還很初級啊,有許多基礎性的知識還沒有掌握啊。以后要努力了。
----------->>>
文章列表