interface (C# 參考)

介面會定義合約。 任何 class 實作該合約的 或 struct ,都必須提供 介面中所定義成員的實作。 從 C# 8.0 開始,介面可能會定義成員的預設實作。 它也可以定義 static 成員,以提供通用功能的單一實作。 從 C# 11 開始,介面可能會定義 static abstractstatic virtual 成員來宣告實作類型必須提供宣告的成員。 一般而言, static virtual 方法會宣告實作必須定義一組 多載運算子

在下列範例中,類別 ImplementationClass 必須實作名為 SampleMethod 的方法,該方法沒有參數並會傳回 void

如需詳細資訊與範例,請參閱介面

範例介面

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();
    }
}

介面可以是命名空間或類別的成員。 介面宣告可以包含宣告 (簽章,而不需要下列成員的任何實作) :

預設介面成員

上述成員宣告通常不包含主體。 從 C# 8.0 開始,介面成員可以宣告主體。 介面中的成員主體是 預設實作。 具有主體的成員允許介面為未提供覆寫實作的類別和結構提供「預設」實作。 此外,從 C# 8.0 開始,介面可能包括:

靜態抽象和虛擬成員

從 C# 11 開始,介面可以宣告 static abstractstatic virtual 成員的所有成員類型,但欄位除外。 介面可以宣告實作類型必須定義運算子或其他靜態成員。 此功能可讓泛型演算法指定類似數位的行為。 您可以在 .NET 執行時間的數數值型別中看到範例,例如 System.Numerics.INumber<TSelf> 。 這些介面會定義許多數數值型別所實作的常見數學運算子。 編譯器必須在編譯時期解析 對 static virtualstatic abstract 方法的呼叫。 在 static virtual 介面中宣告的 和 static abstract 方法沒有類似 virtualabstract 類別中宣告的方法執行時間分派機制。 相反地,編譯器會使用編譯時期可用的類型資訊。 因此, static virtual泛型介面中幾乎完全宣告方法。 此外,宣告 static virtualstatic abstract 方法的大部分介面都宣告其中一個類型參數必須 實作宣告的介面。 例如, INumber<T> 介面宣告必須 TINumber<T> 作 。 編譯器會使用型別引數來解析對介面宣告中所宣告之方法和運算子的呼叫。 例如,型別 int 會實作 INumber<int> 。 當類型參數 T 表示類型引數 int 時,會 static 叫用所 int 宣告的成員。 或者,當 是類型引數時 doublestatic 會叫用在型別上 double 宣告的成員。

重要

static virtual 介面中所宣告方法的方法分派 static abstract 是使用運算式的編譯時間類型來解析。 如果運算式的執行時間類型衍生自不同的編譯時間類型,則會呼叫基底 (編譯時間上的靜態方法) 類型。

您可以使用 介面中靜態抽象成員的教學課程來嘗試這項功能。

介面繼承

介面可能不包含實例狀態。 雖然現在允許靜態欄位,但介面中不允許實例欄位。 介面不支援實例自動屬性,因為它們會隱含地宣告隱藏欄位。 此規則對屬性宣告有細微的影響。 在介面宣告中,下列程式碼不會在 或 structclass 宣告自動實作的屬性。 相反地,它會宣告屬性沒有預設實作,但必須在實作介面的任何類型中實作:

public interface INamed
{
  public string Name {get; set;}
}

介面可以繼承一或多個基底介面。 當介面 覆寫 基底介面中實作的方法時,它必須使用 明確的介面實 作語法。

當基底類型清單包含基底類別和介面時,基底類別一定會排在清單的第一個。

實作介面的類別能夠明確實作該介面的成員。 明確實作的成員無法透過類別實例存取,但只能透過 介面的實例存取。 此外,預設介面成員只能透過 介面的實例來存取。

如需明確介面實作的詳細資訊,請參閱 明確介面實作

範例介面實作

下列範例示範介面實作。 在此範例中,介面包含屬性宣告,而類別包含實作。 實作 IPoint 的任何類別執行個體都有整數屬性 xy

interface IPoint
{
    // Property signatures:
    int X { get; set; }

    int Y { get; set; }

    double Distance { get; }
}

class Point : IPoint
{
    // Constructor:
    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }

    // Property implementation:
    public int X { get; set; }

    public int Y { get; set; }

    // Property implementation
    public double Distance =>
       Math.Sqrt(X * X + Y * Y);
}

class MainClass
{
    static void PrintPoint(IPoint p)
    {
        Console.WriteLine("x={0}, y={1}", p.X, p.Y);
    }

    static void Main()
    {
        IPoint p = new Point(2, 3);
        Console.Write("My Point: ");
        PrintPoint(p);
    }
}
// Output: My Point: x=2, y=3

C# 語言規格

如需詳細資訊,請參閱C# 語言規格介面一節和預設介面成員的功能規格 - C# 8.0

另請參閱