一般來說.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 void MethodB()。 這種隱式介面實現用起來很簡單,但卻有一個缺點,就是它允許客戶可以直接調用實作類別中的方法,(即通過MyInplement obj = new MyInplement ()這樣的方式聲明對象)而不是通過介面 調用實作類別中的方法(即通過的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的了,代碼中就沒有錯了。