接口定義:
接口描述的是可屬于任何類或結構的一組相關功能,所以實現接口的類或結構必須實現接口定義中指定的接口成員。
接口使用interface關鍵字進行定義,可由方法、屬性、事件、索引器或這四種成員類型的任意組合構成。
接口的特性:
1、接口類似于抽象基類,不能直接實例化接口;接口中的方法都是抽象方法,實現
接口的任何非抽象類型都必須實現接口的所有成員。
2、接口不能包含常量、字段、運算符、實例構造函數、析構函數或
類型、不能包含靜態(tài)成員。
3、接口成員是自動公開的,且不能包含任何訪問修飾符。
4、接口自身可從多個接口繼承,類和結構可繼承多個接口,但接口不能繼承類。
interfaceIProgram
{
void Fun();
}
class Program:IProgram
{
//顯式實現接口成員
void IProgram.Fun()
{
Console.WriteLine("I amFun.");
}
staticvoid Main(string[] args)
{
IProgram p =new Program(); //聲明一個接口實例,但不是對接口進行實例化
p.Fun();
Console.Read();
}
}
接口的特性:
實現接口可以顯式實現和隱式實現,那么這兩種實現到底有什么優(yōu)缺點呢?
一般情況,當類或者結構要實現的是單個接口,可以使用隱式實現。
如果類或者結構繼承了多個接口且接口中具有相同名稱成員時,就要用到顯式實現,當顯式實現方式存在時,隱式實現方式就失效了。
interfaceIProgram
{
void Fun();
}
interface IAProgram
{
void Fun();
}
class Program :IProgram, IAProgram
{
void IProgram.Fun() //顯式實現接口IProgram
{
Console.WriteLine("I amIProgram Fun.");
}
void IAProgram.Fun() //顯式實現接口IAProgram
{
Console.WriteLine("I amIAProgram Fun.");
}
//public void Fun() //隱式實現接口
//{
// 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. 接口繼承和類繼承不同:首先,類繼承不僅是說明繼承,而且也是實現繼承;而接口繼承只是說明繼承。
2.也就是說,派生類可以繼承基類的方法實現,而派生的接口只繼承了父接口的成員方法說明,而沒有繼承父接口的實現。
3.C#中類繼承只允許單繼承,但是接口繼承允許多繼承,一個子接口可以有多個父接口。
接口的覆蓋:
由于接口的實現沒有方法體,抽象方法也沒有方法體,那么當我們在接口的實現方法里調用抽象方法時,會如何執(zhí)行呢?
結果是:抽象類子類的實現方法功能
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.接口中只能聲明方法,屬性,事件,索引器。而抽象類中可以有方法的實現,也以定義非靜態(tài)的類變量。
3.抽象類是類,所以只能被單繼承,但是接口卻可以一次實現多個。
4.抽象類可以提供某些方法的部分實現,接口不可以。
5.抽象類的實例是它的子類給出的。接口的實例是實現接口的類給出的