前言:
當我們定義介面的成員的時候不需要寫存取控制符,因為它是預設public的,也只能是public。當一個類要實現這個介面的時候,自然要公開其成員。一直以來我都這麼做。 interface Interface1
{
string GetName(string name);
}
class Class1:Interface1
{
public string GetName(string name)
{
return name;
}
}
}
然而這麼做並沒有錯。直到我學習控制項開發的時候,發現了原來介面可以這麼來實現。public class DropDownList : ListControl, IPostBackDataHandler
{
protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
return false;
}
protected virtual void RaisePostDataChangedEvent()
{
}
bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection)
{
return this.LoadPostData(postDataKey, postCollection);
}
void IPostBackDataHandler.RaisePostDataChangedEvent()
{
this.RaisePostDataChangedEvent();
}
}
LoadPostData和RaisePostData方法是Page調用的,但卻沒有公開這兩個方法。調用的時候不能用類的執行個體來調用,只能用介面的引用來調用,從而實現實現介面的執行個體只能被介面的引用調用的目的。
從此我就想到安全介面這個名稱(不知道合理否),在編程中,我亦可以這麼使用。 class Class1:Interface1
{
private string GetName(string name)
{
return name;
}
string Interface1.GetName(string name)
{
name += " interface";
return GetName(name);
}
}
class Program
{
static void Main(string[] args)
{
Class1 c = new Class1();
Interface1 i = (Interface1)c;
System.Console.WriteLine(i.GetName("Eric Wen"));
}
}
我覺得這樣更符合oo,介面的方法不會泛用,實現和調用都和清晰。
後續:
看了回複後知道這種情況就是顯示實現介面(Explicit interface member implementations)。
顯示實現介面說明:
1、不能在方法調用、屬性訪問以及索引指標訪問中通過全權名訪問顯式介面成員執行體。事實上,顯式介面成員執行體只能通過介面的執行個體,僅僅引用介面的成員名稱來訪問。
2、顯式介面成員執行體不能使用任何訪問限制符,也不能加上abstract, virtual, override或static 修飾符。
3、顯式介面成員執行體和其他成員有著不同的訪問方式。因為不能在方法調用、屬性訪問以及索引指標訪問中通過全權名訪問,顯式介面成員執行體在某種意義上是私人的。但它們又可以通過介面的執行個體訪問,也具有一定的公有性質。
4、只有類在定義時,把介面名寫在了基類列表中,而且類中定義的全權名、類型和傳回型別都與顯式介面成員執行體完全一致時,顯式介面成員執行體才是有效
5、如果一個類中既顯示又隱式的實現了介面,這是顯示元素只能通過介面的引用來直接存取,隱式元素只可以通過類來直接存取。
為什麼要顯示實現介面呢,目的:
1、因為顯式介面成員執行體不能通過類的執行個體進行訪問,這就可以從公有介面中把介面的實現部分單獨分離開。如果一個類只在內部使用該介面,而類的使用者不會直接使用到該介面,這種顯式介面成員執行體就可以起到作用。
2、顯式介面成員執行體避免了介面成員之間因為同名而發生混淆。如果一個類希望對名稱和傳回型別相同的介面成員採用不同的實現方式,這就必須要使用到顯式介面成員執行體。如果沒有顯式介面成員執行體,那麼對於名稱和傳回型別不同的介面成員,類也無法進行實現。
參考:http://www.chinaitpower.com/A/2004-12-09/136479.html