跳轉到內容

C# 程式設計/介面

來自 Wikibooks,開放的書籍,開放的世界

C# 中的**介面**是一種類似於類的型別定義,但它純粹表示物件與其使用者之間的契約。它既不能直接例項化為物件,也不能定義資料成員。因此,介面只不過是一組方法和屬性宣告的集合。以下定義了一個簡單的介面

interface IShape
{
    double X { get; set; }
    double Y { get; set; }
    void Draw();
}

在 .NET 框架(以及許多 C# 程式設計師)中使用的一種**約定**是在介面名稱的開頭放置一個“I”,以將其與類名稱區分開來。當介面僅宣告一個關鍵方法時,例如上述示例中的Draw(),就會使用另一種常見的介面命名約定。然後,介面名稱透過新增“...able”字尾形成形容詞。因此,上面的介面名稱也可以是IDrawable。此約定在整個 .NET 框架中使用。

實現介面只需從它繼承並在之後定義介面宣告的所有方法和屬性即可。例如,

class Square : IShape
{
    private double _mX, _mY;

    public void Draw() { ... }

    public double X 
    { 
        set { _mX = value; }
        get { return _mX; }  
    }

    public double Y 
    {
        set { _mY = value; }
        get { return _mY; }
    }
}

儘管一個類只能從一個類繼承,但它可以從任意數量的介面繼承。這是 C# 支援的一種簡化的多重繼承形式。當從一個類和一個或多個介面繼承時,應首先在繼承列表中提供基類,然後是任何要實現的介面。例如

class MyClass : Class1, Interface1, Interface2 { ... }

可以使用介面型別宣告物件引用。例如,使用前面的示例,

class MyClass 
{
    static void Main()
    {
        IShape shape = new Square();
        shape.Draw();
    }
}

介面可以從任意數量的其他介面繼承,但不能從類繼承。例如

interface IRotateable
{
    void Rotate(double theta);
}

interface IDrawable : IRotateable
{
    void Draw();
}

更多細節

[編輯 | 編輯原始碼]

不能為介面成員提供訪問說明符(即privateinternal等),因為所有成員預設都是公共的。實現介面的類必須定義介面宣告的所有成員。如果期望在子類中重寫已實現的方法,則實現類可以選擇將已實現的方法設為虛擬方法。

介面中沒有靜態方法,但任何靜態方法都可以在管理使用它的物件的類中實現。

除了方法和屬性之外,介面還可以宣告事件和索引器。

對於熟悉 Java 的人來說,C# 的介面與 Java 的非常相似。

華夏公益教科書