接口定義了所有類繼承接口時應遵循的語法合同。接口定義了語法合同 "是什麼" 部分,派生類定義了語法合同 "怎麼做" 部分。
接口定義了屬性、方法和事件,這些都是接口的成員。接口只包含了成員的聲明。成員的定義是派生類的責任。接口提供了派生類應遵循的標准結構。
抽象類在某種程度上與接口類似,但是,它們大多只是用在當只有少數方法由基類聲明由派生類實現時。
接口是引用類型的,類似於類,和抽象類的相似之處有三點:
1、不能實例化;
2、包含未實現的方法聲明;
3、派生類必須實現未實現的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員);
另外,接口有如下特性:接口除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他的成員,例如:常量、域、構造函數、析構函數、靜態成員。一個類可以直接繼承多個接口,但只能直接繼承一個類(包括抽象類)。
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/)
該文純粹屬於個人學習,有不足之處請多多指教!(文章部分內容摘自網絡,如果侵犯您的權益,請及時聯系我,謝謝。)