一、爲何要使用接口,我憑什麼要使用接口,他對我有什麼利用價值?程序員
答:簡單的說,經過多態的方式,使用接口能夠很好的隱藏代碼實現細節,從而解決代碼維護不易的問題。學習
二、C#接口的做用?spa
答:設計
C#接口是一個讓不少初學C#者容易迷糊的東西,用起來好像很簡單,定義接口,裏面包含方法,但沒有方法具體實現的代碼,而後在繼承該接口的類裏面要實現接口的全部方法的代碼,但沒有真正認識到接口的做用的時候就以爲用接口是畫蛇添足,固然你這樣想那是絕對絕對錯誤的,比爾蓋茨的微軟請的員工都是比蓋茨還聰明的人,他們的C#能添這樣的多足嗎?!關於接口的做用,網上有一位就真的深刻淺出給咱們作了很好理解的分析。 code
咱們定義一個接口blog
public interface IBark { void Bark(); }
再定義一個類,繼承於IBark,而且必需實現其中的Bark()方法繼承
public class Dog:IBark { public Dog() {} public void Bark() { Consol.write("汪汪"); } }
而後,聲明Dog的一個實例,並調用Bark()方法接口
Dog 旺財=new Dog(); 旺財.Bark();
試想同樣,如果想調用Bark()方法,只須要在Dog()中聲明這樣的一個方法不就好了嗎,幹什麼還要用接口呢.由於接口中並無Bark()具體實現.真的實現仍是要在Dog()中.那麼使用接口不是畫蛇添足嗎?
還有人是這樣說的:從接口的定義方面來講,接口其實就是類和類之間的一種協定,一種約束.還拿上面的例子來講.全部繼承了IBark接口的類中必需實現Bark()方法.那麼從用戶(使用類的用戶)的角度來講,若是他知道了某個類是繼承於IBark接口,那麼他就能夠放心大膽的調用Bark()方法,而不用管Bark()方法具體是如何實現的.好比,咱們另外寫了一個類.it
public class Cat:IBark { public Cat() {} public void Bark() { Consol.write("喵喵"); } }
當用戶用到Cat類或是Dog類的時候,知道他們繼承於IBark,那麼不用管類裏的具體實現,而就能夠直接調用Bark()方法,由於這兩個類中確定有關於Bark()方法的具體實現.
若是咱們從設計的角度來看.一個項目中用若干個類須要去編寫,因爲這些類比較複雜,工做量比較大,這樣每一個類就須要佔用一個工做人員進行編寫.好比A程序員去定Dog類,B程序員去寫Cat類.這兩個類原本沒什麼聯繫的,但是因爲用戶須要他們都實現一個關於"叫"的方法.這就要對他們進行一種約束.讓他們都繼承於IBark接口,目的是方便統一管理.另外一個是方便調用.固然了,不使用接口同樣能夠達到目的.只不過這樣的話,這種約束就不那麼明顯,若是這樣類還有Duck類等等,比較多的時候不免有人會漏掉這樣方法.因此說仍是經過接口更可靠一些,約束力更強一些.class
三、C#中接口的深刻淺出
經過學習對C#中接口的做用有了更進一步的理解,拿出來跟你們分享一下,有說的不對的地方請你們指教。
假設咱們公司有兩種程序員:VB程序員,指的是用VB寫程序的程序員,用clsVBProgramer這個類表示;Delphi程序員指的是用Delphi寫程序的程序員,用clsDelphiProgramer這個類來表示。每一個類都有一個WriteCode()方法。定義以下:
class clsVBProgramer()
{
....
WriteCode()
{
//用VB語言寫代碼;
}
....
}
class clsDelphiProgramer()
{
....
WriteCode()
{
//用Delphi語言寫代碼;
}
....
}
如今公司來了一個項目,要求派某個程序員寫一個程序。
class clsProject()
{
....
WritePrograme(clsVBProgramer programer)//用VB寫代碼
{
programer.WriteCode();
}
WritePrograme(clsDelphiProgramer programer)//重載方法,用Delphi寫代碼
{
programer.WriteCode();
}
......
}
在主程序中咱們能夠這樣寫:
main()
{
clsProject proj=new clsProject;
//若是須要用VB寫代碼
clsVBProgramer programer1=new clsVBProgramer;
proj.WritePrograme(programer1);
//若是須要用Delphi寫代碼
clsDelphiProgramer programer2=new clsDelphiProgramer;
proj.WritePrograme(programer2);
}
可是若是這時公司又來了一個C#程序員,咱們怎麼改這段程序,使它可以實現用C#寫程序的功能呢?咱們須要增長一個新類clsCSharpProgramer,同時在此clsProject這個類中要再次重載WritePrograme(clsCSharpProgramer programer)方法。這下麻煩多了。若是還有C程序員,C++程序員,JAVA程序員呢。麻煩大了!
可是若是改用接口,就徹底不同了:
首先聲明一個程序員接口:
interface IProgramer()
{
WriteCode();
}
而後聲明兩個類,並實現IProgramer接口:
class clsVBProgramer():IProgramer
{
....
WriteCode()
{
//用VB語言寫代碼;
}
....
}
class clsDelphiProgramer():IProgramer
{
....
WriteCode()
{
//用Delphi語言寫代碼;
}
....
}
對clsProject這個類進行一下修改:
class clsProject()
{
....
WritePrograme(IProgramer programer)
{
programer.WriteCode();//寫代碼
}
......
}
main()
{
clsProject proj=new clsProject;
IProgramer programer;
//若是須要用VB寫代碼
programer=new clsVBProgramer;
proj.WritePrograme(programer);
//若是須要用Delphi寫代碼
programer=new clsDelphiProgramer;
proj.WritePrograme(programer);
}
若是再有C#,C,C++,JAVA這樣的程序員添加進來的話,咱們只需把它們相關的類加進來,而後在main()中稍作修改就OK了。擴充性特別好!
另外咱們若是把clsProject這個類封成一個組件,那麼當咱們的用戶須要要擴充功能的時候,咱們只須要在外部作很小的修改就能實現,能夠說根本就用不着改動咱們已經封好組件!是否是很方便,很強大!