當我們定義接口的成員的時候不需要寫訪問控制符,因爲它是默認public的,也只能是public.當一個類要實現這個接口的時候,自然要公開其成員。
interface Interface1
{
string GetUserName(string name);
}
class Class1:Interface1
{
public string GetUserName(string name)
{
return name;
}
}
一直以來我都這麼做,而且也認爲理所當然的。前幾天,複習.net的知識時,無意中發現.net中接口還可以顯示的實現,我們所常用的只是隱式實現而已。
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
interface Interface1
{
int Method1();
int Method2();
}
interface Interface2
{
int Method1();
int Method2();
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class TestClass : Interface1, Interface2
{
public void TestMethod()
{
Interface1 inf1 = (Interface1)this;
Console.WriteLine("return value is :" + inf1.Method1());
Interface2 inf2 = (Interface2)this;
Console.WriteLine("return value is :" + inf2.Method2());
Console.WriteLine("return value is :" + this.Method1());//調用的是隱式實現的方法
Console.WriteLine("return value is :" + this.Method2());//調用的是隱式實現的方法
}
int Interface2.Method1()
{
return 1;
}
int Interface2.Method2()
{
return 2;
}
int Interface1.Method1()
{
return 3;
}
int Interface1.Method2()
{
return 4;
}
public int Method1()
{
return 5;
}
public int Method2()
{
return 6;
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
new TestClass().TestMethod();
}
}
}
輸出爲:
return value is :3
return value is :2
return value is :5
return value is :6
顯示實現接口說明:
1、不能在方法調用、屬性訪問以及索引指示器訪問中通過全權名訪問顯式接口成員執行體。事實上,顯式接口成員執行體只能通過接口的實例,也就是僅僅引用接口的成員名稱來訪問;
2、顯式接口成員執行體不能使用任何訪問限制符,也不能加上abstract, virtual, override或static 修飾符,即使是public也不可以;
3、顯式接口成員執行體和其他成員有着不同的訪問方式。因爲不能在方法調用、屬性訪問以及索引指示器訪問中通過全權名訪問,顯式接口成員執行體在某種意義上是私有的。但它們又可以通過接口的實例訪問,也具有一定的公有性質;
4、只有類在定義時,把接口名寫在了基類列表中,而且類中定義的全權名、類型和返回類型都與顯式接口成員執行體完全一致時,顯式接口成員執行體纔是有效的;
5、一個類中既顯示又隱式的實現接口,這時顯式實現方法只能通過接口的引用來直接訪問,隱式實現方法只可以通過類的實例來直接訪問;
6、一個類如果實現惡劣多個接口,並且這多個被實現的接口含有相同簽名的接口聲明,那麼如果其中有一個被顯式實現,那麼其它接口中同簽名的方法也必須被顯式實現。
爲什麼要顯示實現接口呢,有如下好處:
1、因爲顯式接口成員執行體不能通過類的實例進行訪問,這就可以從公有接口中把接口的實現部分單獨分離開。如果一個類只在內部使用該接口,而類的使用者不會直接使用到該接口,這種顯式接口成員執行體就可以起到作用。
2、顯式接口成員執行體避免了接口成員之間因爲同名而發生混淆。如果一個類希望對名稱和返回類型相同的接口成員採用不同的實現方式,這就必須要使用到顯式接口成員執行體。如果沒有顯式接口成員執行體,那麼對於名稱和返回類型不同的接口成員,類也無法進行實現。