簡介
1. 接口是一個引用類型,通過接口可以實現多重繼承。
2. C#中接口的成員不能有new、public、protected、internal、private等修飾符。
3. 接口中只能聲明"抽象"成員(所以不能直接下一步對接口進行實例化(即不能使用new操作符聲明一個接口的實例對 象)),而不能聲明共有的域或者私有的成員變數。
4. 接口聲明不包括數據成員,只能包含方法、屬性、事件、索引等成員。
5. 接口名稱一般都以“I”作為首字母(當然不這樣聲明也可以),這也是接口和類的一個區別之一。
6. 接口成員的訪問級別是默認的(默認為public),所以在聲明時不能再為接口成員指定任何訪問修飾符,否則 編譯器會報錯。
7. 接口成員不能有static、abstract、override、virtual修飾符,使用new修飾符不會報錯,但會給出警告說不需要關鍵字new。
8. 在聲明接口成員的時候,不準為接口成員編寫具體的可執行代碼,也就是說,只要在對接口進行聲明時指明接口的成員名稱和參數就可以了。
9. 接口一旦被實現,實現類必須實現接口中的所有成員,除非實現類本身是抽象類(通過具體的可執行代碼實現接口抽象成員的操作)。
C#接口
C#接口代碼學習
c#代碼參考
接口(C# 參考)
接口包含的成員只有方法,屬性,
索引器(有參屬性),事件四種成員。方法的實現是在實現接口的類中完成的,如下面的示例所示:
interface ISampleInterface
{
void SampleMethod();
}
class ImplementationClass : ISampleInterface
{
// Explicit interface member implementation:
void ISampleInterface.SampleMethod()
{
// Method implementation.
}
static void Main()
{
// Declare an interface instance.
ISampleInterface obj = new ImplementationClass();
// Call the member.
obj.SampleMethod();
}
}
---------------------------------------------------------------------------------------------------------
備註:
接口可以是命名空間或類的成員,並且可以包含下列成員的簽名:
·方法 ·屬性 ·索引器 ·事件
事件
一個接口可從一個或多個基接口繼承。
當
基類型列表包含基類和接口時,基類必須是列表中的第一項。
實現接口的類可以顯式實現該接口的成員。顯式實現的成員不能通過類實例訪問,而只能通過接口實例訪問。
---------------------------------------------------------------------------------------------------------
示例
下面的示例演示了接口的隱式實現。在此例中,接口 IPoint 包含屬性聲明,後者負責設定和獲取欄位的值。Point 類包含屬性實現。
using System;
interface IPoint
{
int x { get; set; }//聲明屬性存取規則
int y { get; set; }
//僅為示例用,不要計較代碼實現。
void DrawLine(); //注意:不可有任何修飾詞
}
interface ILine
{
void DrawLine();
}
//注意:我們要實現的兩個接口中都有 DrawLine 方法。
class CPoint : IPoint,ILine
{
private int _x;
private int _y;
public CPoint(int x, int y)//定義構造函式
{
_x = x;
_y = y;
}
public int x //屬性成員的實現
{
get { return _x; }
set { _x=x; }
}
public int y
{
get { return _y; }
set { _y =y; }
}
//顯式實現 ILine 中的 DrawLine 方法,注意不可添加任何修飾詞。
void ILine.DrawLine()
{
Console.WriteLine("顯式實現的 ILine.DrawLine() 方法,僅可在型別為 ILine 時才可呼叫本方法。");
}
//現在再隱式實現DrawLine,注意此時我們可以添加 Virtual 使其成為虛方法,
//這樣就可在衍生類中用 override 重寫本方法。
public void virtual DrawLine()
{
Console.WriteLine("隱式實現的 IPoint.DrawLine() 方法,可用本類實例或 IPoint 型別來呼叫本方法。 ");
}
}
//我們再衍生下一個子類。
public class TestIFace:CPoint
{
public void override DrawLine()
{
Console.WriteLine("這是 TestIFace 類中重寫的 DrawLine()方法。");
}
//想一想:能否再次顯式實現 ILine 中的 DrawLine 方法呢?
//當我們在本類的基類中再加上ILine,即變成 public class TestIFace:CPoint,ILine 時就可以。
}
class Program
{
public static void PrintPoint(IPoint p) //定義輸出函式
{
Console.WriteLine("x={0},y={1}", p.x, p.y);
}
static void Main(string[] args)
{
TestIFace testObj=newTestIFace();
CPoint p = new CPoint(2, 3);
Console.WriteLine("My CPoint is:");
PrintPoint(p);
p.DrawLine(); //注意:((IPoint)p).DrawLine(); 兩者結果一樣。
((ILine)p).DrawLine(); //注意:((ILine)testObj).DrawLine(); 兩者結果一樣。
((IPoint)testObj).DrawLine();//調用的將是 TestIFace 類中重寫的 DrawLine 方法。
Console.ReadKey();
}
}
輸出結果:
My Point is: x=2, y=3
隱式實現的 IPoint.DrawLine() 方法,可用本類實例或 IPoint 型別來呼叫本方法。
顯式實現的 ILine.DrawLine() 方法,僅可在型別為 ILine 時才可呼叫本方法。
這是 TestIFace 類中重寫的 DrawLine()方法。