接口定義:
接口描述的是可屬于任何類或結(jié)構(gòu)的一組相關(guān)功能觉啊,所以實(shí)現(xiàn)接口的類或結(jié)構(gòu)必須實(shí)現(xiàn)接口定義中指定的接口成員嘉抒。
接口使用interface關(guān)鍵字進(jìn)行定義姿鸿,可由方法殖卑、屬性站削、事件、索引器或這四種成員類型的任意組合構(gòu)成懦鼠。
接口的特性:
1钻哩、接口類似于抽象基類,不能直接實(shí)例化接口肛冶;接口中的方法都是抽象方法街氢,實(shí)現(xiàn)
接口的任何非抽象類型都必須實(shí)現(xiàn)接口的所有成員。
2睦袖、接口不能包含常量珊肃、字段、運(yùn)算符馅笙、實(shí)例構(gòu)造函數(shù)伦乔、析構(gòu)函數(shù)或
類型、不能包含靜態(tài)成員董习。
3烈和、接口成員是自動公開的,且不能包含任何訪問修飾符皿淋。
4招刹、接口自身可從多個接口繼承,類和結(jié)構(gòu)可繼承多個接口窝趣,但接口不能繼承類疯暑。
interfaceIProgram
{
void Fun();
}
class Program:IProgram
{
//顯式實(shí)現(xiàn)接口成員
void IProgram.Fun()
{
Console.WriteLine("I amFun.");
}
staticvoid Main(string[] args)
{
IProgram p =new Program(); //聲明一個接口實(shí)例,但不是對接口進(jìn)行實(shí)例化
p.Fun();
Console.Read();
}
}
接口的特性:
實(shí)現(xiàn)接口可以顯式實(shí)現(xiàn)和隱式實(shí)現(xiàn)哑舒,那么這兩種實(shí)現(xiàn)到底有什么優(yōu)缺點(diǎn)呢妇拯?
一般情況,當(dāng)類或者結(jié)構(gòu)要實(shí)現(xiàn)的是單個接口洗鸵,可以使用隱式實(shí)現(xiàn)越锈。
如果類或者結(jié)構(gòu)繼承了多個接口且接口中具有相同名稱成員時,就要用到顯式實(shí)現(xiàn)膘滨,當(dāng)顯式實(shí)現(xiàn)方式存在時瞪浸,隱式實(shí)現(xiàn)方式就失效了。
interfaceIProgram
{
void Fun();
}
interface IAProgram
{
void Fun();
}
class Program :IProgram, IAProgram
{
void IProgram.Fun() //顯式實(shí)現(xiàn)接口IProgram
{
Console.WriteLine("I amIProgram Fun.");
}
void IAProgram.Fun() //顯式實(shí)現(xiàn)接口IAProgram
{
Console.WriteLine("I amIAProgram Fun.");
}
//public void Fun() //隱式實(shí)現(xiàn)接口
//{
// Console.WriteLine("I am Program Fun.");
//}
staticvoid Main(string[] args)
{
//IProgram p = new Program();
//p.Fun();
//IAProgram ap = new Program();
//ap.Fun();
Program pro =new Program();
((IProgram)pro).Fun();
((IAProgram)pro).Fun();
Console.Read();
}
}
接口的繼承:
1. 接口繼承和類繼承不同:首先吏祸,類繼承不僅是說明繼承对蒲,而且也是實(shí)現(xiàn)繼承;而接口繼承只是說明繼承贡翘。
2.也就是說蹈矮,派生類可以繼承基類的方法實(shí)現(xiàn),而派生的接口只繼承了父接口的成員方法說明鸣驱,而沒有繼承父接口的實(shí)現(xiàn)泛鸟。
3.C#中類繼承只允許單繼承,但是接口繼承允許多繼承踊东,一個子接口可以有多個父接口北滥。
接口的覆蓋:
由于接口的實(shí)現(xiàn)沒有方法體刚操,抽象方法也沒有方法體,那么當(dāng)我們在接口的實(shí)現(xiàn)方法里調(diào)用抽象方法時再芋,會如何執(zhí)行呢菊霜?
結(jié)果是:抽象類子類的實(shí)現(xiàn)方法功能
interfaceIProgram
{
void Fun();
}
abstract class AProgram : IProgram
{
public abstract void AFun();
void IProgram.Fun()
{
AFun();
}
}
classProgram:AProgram
{
public override void AFun()
{
Console.WriteLine("I amAProgram.");
}
staticvoid Main(string[] args)
{
IProgram pro =new Program();
pro.Fun();
}
}
接口和抽象類的區(qū)別:
1.接口用于規(guī)范,抽象類用于共性济赎。
2.接口中只能聲明方法鉴逞,屬性,事件司训,索引器构捡。而抽象類中可以有方法的實(shí)現(xiàn),也以定義非靜態(tài)的類變量壳猜。
3.抽象類是類勾徽,所以只能被單繼承,但是接口卻可以一次實(shí)現(xiàn)多個统扳。
4.抽象類可以提供某些方法的部分實(shí)現(xiàn)捂蕴,接口不可以。
5.抽象類的實(shí)例是它的子類給出的闪幽。接口的實(shí)例是實(shí)現(xiàn)接口的類給出的