C# 介面(Interface) 介面定義了所有類繼承介面時應遵循的語法合同。介面定義了語法合同 "是什麼" 部分,派生類定義了語法合同 "怎麼做" 部分。 介面定義了屬性、方法和事件,這些都是介面的成員。介面只包含了成員的聲明。成員的定義是派生類的責任。介面提供了派生類應遵循的標準結構。 抽象類在 ...
C# 介面(Interface)
介面定義了所有類繼承介面時應遵循的語法合同。介面定義了語法合同 "是什麼" 部分,派生類定義了語法合同 "怎麼做" 部分。
介面定義了屬性、方法和事件,這些都是介面的成員。介面只包含了成員的聲明。成員的定義是派生類的責任。介面提供了派生類應遵循的標準結構。
抽象類在某種程度上與介面類似,但是,它們大多只是用在當只有少數方法由基類聲明由派生類實現時。
介面是引用類型的,類似於類,和抽象類的相似之處有三點:
1、不能實例化;
2、包含未實現的方法聲明;
3、派生類必須實現未實現的方法,抽象類是抽象方法,介面則是所有成員(不僅是方法包括其他成員);
另外,介面有如下特性:介面除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他的成員,例如:常量、域、構造函數、析構函數、靜態成員。一個類可以直接繼承多個介面,但只能直接繼承一個類(包括抽象類)。
C#介面的作用
1.介面用於描述一組類的公共方法/公共屬性. 它不實現任何的方法或屬性,只是告訴繼承它的類《至少》要實現哪些功能,繼承它的類可以增加自己的方法.
2.使用介面可以使繼承它的類: 命名統一/規範,易於維護.比如: 兩個類 "狗"和"貓",如果它們都繼承了介面"動物",其中動物裡面有個方法Behavior(),那麼狗和貓必須得實現Behavior()方法,並且都命名為Behavior這樣就不會出現命名太雜亂的現象.如果命名不是Behavior(),介面會約束即不按介面約束命名編譯不會通過.
3.提供永遠的介面。 當類增加時,現有介面方法能夠滿足繼承類中的大多數方法,沒必要重新給新類設計一組方法,也節省了代碼,提高了開發效率
聲明介面
介面使用 interface 關鍵字聲明,它與類的聲明類似。介面聲明預設是 public 的。下麵是一個介面聲明的實例:
//公共介面: "動物" public interface IAnimal { void Behavior(); //行為方法,描述各種動物的特性 } //類: 狗 public class Dog : IAnimal { public void Behavior() { //Console.Write("我晚上睡覺,白天活動"); MessageBox.Show("我晚上睡覺,白天活動"); } } //類: 貓 public class Cat : IAnimal { public void Behavior() { //Console.Write("我白天睡覺,晚上活動"); MessageBox.Show("我白天睡覺,晚上活動"); } } //簡單的應用: public static Main() { Dog myDog = new Dog(); myDog.Behavior(); //輸出: "我晚上睡覺,白天活動" Cat myCat = new Cat(); myCat.Behavior(); //輸出: "我白天睡覺,晚上活動" }
以上調用不同的類的相同名方法,會輸出不同的東東,也就是說每個類裡面的同名方法完成的功能可以是完全不同的.
更進一步,不是用上面Main方法這樣一個一個調用類的方法,用多態性實現其調用.
看一下下麵這個方法:
public void Behavior(IAnimal myIanimal) { myIanimal.Behavior(); }
其參數是介面類型,任何繼承它的類都可以調用此方法,此方法能根據類的不同調用不同的類 中的方法. 也即能夠自己根據不同的類,完成不同的類的功能.
多態性代碼示例:
Dog myDog = new Dog(); Cat myCat = new Cat(); Behavior(myDog); //Behavior接受“狗”類實例 Behavior(myCat); //Behavior接受“狗”類實例
這樣Behavior方法寫一次就能完成所有繼承它的類中的相同名方法的不同功能. 非常方便,同樣,由於“動物軟體”功能需求,需要再增加一個"龜"類:
//類: 龜 public Tortoise: IAnimal { public void Behavior() { MessageBox.Show("我可以不活動,一睡就睡五千年!"); } }
那麼也可以調用上面多態方法,所以說介面使方法具有較好擴展性. 如果繼承它的類很多的話,有多少好處是可想而知的!(出處:http://blog.csdn.net/yunhaic/article/details/6662843)
同樣,假設我們公司有兩種程式員:VB程式員,指的是用VB寫程式的程式員,用clsVBProgramer這個類表示;Delphi程式員指的是用Delphi寫程式的程式員,用clsDelphiProgramer這個類來表示。每個類都有一個WriteCode()方法。定義如下:
public class clsVBProgramer { public void WriteCode() { //用VB語言寫代碼; } } public class clsDelphiProgramer { public void WriteCode() { //用Delphi語言寫代碼; } } public class clsProject { public void WritePrograme(clsVBProgramer programer)//用VB寫代碼 { programer.WriteCode(); } public void WritePrograme(clsDelphiProgramer programer)//重載方法,用Delphi寫代碼 { programer.WriteCode(); } } static void Main(string[] args) { 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程式員呢。麻煩大了!
但是如果改用介面,就完全不一樣了:
首先聲明一個程式員介面:
class Program { static void Main(string[] args) { clsProject proj = new clsProject(); IProgramer programer; //如果需要用VB寫代碼 programer = new clsVBProgramer(); proj.WritePrograme(programer); //如果需要用Delphi寫代碼 programer = new clsDelphiProgramer(); proj.WritePrograme(programer); } } /// <summary> /// 聲明介面 /// </summary> public interface IProgramer { void WriteCode(); } //然後聲明類,並實現IProgramer介面: /// <summary> /// VB程式員實現的WriteCode方法 /// </summary> public class clsVBProgramer : IProgramer { public void WriteCode() { //用VB語言寫代碼; Console.WriteLine("我是VB程式員實現的"); } } /// <summary> /// Delphi程式員實現的WriteCode方法 /// </summary> public class clsDelphiProgramer : IProgramer { public void WriteCode() { //用Delphi語言寫代碼; Console.WriteLine("我是Delphi程式員實現的"); } } /// <summary> /// CSharp程式員實現的WriteCode方法 /// </summary> public class clsCSharpProgramer : IProgramer { public void WriteCode() { //用Delphi語言寫代碼; Console.WriteLine("我是CSharp程式員實現的"); } } /// <summary> /// 項目 /// </summary> public class clsProject { public void WritePrograme(IProgramer programer) { programer.WriteCode();//寫代碼 } }
這樣的如果再有程式員添加進來的話,我們只需把它們相關的類加進來,然後在main()中稍做修改就OK了。擴充性特別好!
另外我們如果把clsProject這個類封成一個組件,那麼當我們的用戶需要要擴充功能的時候,我們只需要在外部做很小的修改就能實現,可以說根本就用不著改動我們已經封好組件!這樣就很方便,很強大!(出處:http://blog.jobbole.com/85751/)
該文純粹屬於個人學習,有不足之處請多多指教!(文章部分內容摘自網路,如果侵犯您的權益,請及時聯繫我,謝謝。)