interface (C#-Referenz)

Eine Schnittstelle definiert einen Vertrag. Jede class oder struct, die diesen Vertrag implementiert, muss eine Implementierung der in der Schnittstelle definierten Member bereitstellen. Ab C# 8.0 kann eine Schnittstelle eine Standardimplementierung für Member definieren. Sie kann auch static-Member definieren, um eine einzelne Implementierung für allgemeine Funktionen bereitzustellen. Ab C# 11 kann eine Schnittstelle definieren oder static virtual Member deklarierenstatic abstract, dass ein Implementierungstyp die deklarierten Member bereitstellen muss. In der Regel deklarieren Methoden, static virtual dass eine Implementierung einen Satz überladener Operatoren definieren muss.

Im folgenden Beispiel muss die Klasse ImplementationClass eine Methode mit dem Namen SampleMethod implementieren, die keine Parameter hat und void zurückgibt.

Weitere Informationen und Beispiele finden Sie unter Schnittstellen.

Beispielschnittstelle

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

Eine Schnittstelle kann ein Member eines Namespaces oder einer Klasse sein. Eine Schnittstellendeklaration kann Deklarationen der folgenden Member enthalten (Signaturen ohne Implementierungen):

Standardschnittstellenmember

Diese vorherigen Memberdeklarationen enthalten in der Regel keinen Textkörper. Ab C# 8.0 kann ein Schnittstellenmember einen Text deklarieren. Member-Bodies in einer Schnittstelle sind die Standardimplementierung. Member mit Text ermöglichen der Schnittstelle, eine „Standardimplementierung“ für Klassen und Strukturen bereitzustellen, die keine überschreibende Implementierung bereitstellen. Außerdem kann eine Schnittstelle ab C# 8.0 Folgendes umfassen:

Statische abstrakte und virtuelle Member

Ab C# 11 kann eine Schnittstelle alle Membertypen außer Feldern deklarieren static abstract und static virtual membern. Schnittstellen können deklarieren, dass implementierungstypen Operatoren oder andere statische Member definieren müssen. Dieses Feature ermöglicht generische Algorithmen zum Angeben des zahlenähnlichen Verhaltens. Beispiele in den numerischen Typen in der .NET-Laufzeit, z System.Numerics.INumber<TSelf>. B. . Diese Schnittstellen definieren allgemeine mathematische Operatoren, die von vielen numerischen Typen implementiert werden. Der Compiler muss Aufrufe und static virtualstatic abstract Methoden zur Kompilierungszeit auflösen. static abstract Die static virtual in Schnittstellen deklarierten Methoden weisen keinen Laufzeit-Dispatch-Mechanismus analog zu virtual oder abstract Methoden, die in Klassen deklariert sind. Stattdessen verwendet der Compiler Typinformationen, die zur Kompilierungszeit verfügbar sind. static virtual Daher werden Methoden fast ausschließlich in generischen Schnittstellen deklariert. Darüber hinaus müssen die meisten Schnittstellen, die deklarieren oder static abstract Methoden deklarierenstatic virtual, dass eine der Typparameter die deklarierte Schnittstelle implementieren muss. Beispielsweise deklariert die INumber<T> Schnittstelle, die T implementiert INumber<T>werden muss. Der Compiler verwendet das Typargument, um Aufrufe der Methoden und Operatoren aufzulösen, die in der Schnittstellendeklaration deklariert sind. Beispielsweise implementiert INumber<int>der int Typ . Wenn der Typparameter das Typargument Tintanschreibt, werden die elemente aufgerufen, die static aktiviert sind int . double Wenn es sich um das Typargument handelt, werden die elemente, die static für den double Typ deklariert sind, aufgerufen.

Wichtig

Der Methodenversand für static abstract und static virtual methoden, die in Schnittstellen deklariert sind, wird mithilfe des Kompilierungszeittyps eines Ausdrucks aufgelöst. Wenn der Laufzeittyp eines Ausdrucks von einem anderen Kompilierungszeittyp abgeleitet wird, werden die statischen Methoden für den Basistyp (Kompilierungszeit) aufgerufen.

Sie können dieses Feature ausprobieren, indem Sie mit dem Lernprogramm an statischen abstrakten Elementen in Schnittstellen arbeiten.

Schnittstellenvererbung

Schnittstellen dürfen keinen Instanzstatus enthalten. Während statische Felder jetzt zulässig sind, sind Instanzfelder in Schnittstellen nicht zulässig. Instanzeigenschaften werden in Schnittstellen nicht unterstützt, da sie implizit ein ausgeblendetes Feld deklarieren würden. Diese Regel hat eine fast unmerkliche Auswirkung auf Eigenschaftsdeklarationen. In einer Schnittstellendeklaration deklariert der folgende Code keine automatisch implementierte Eigenschaft wie in einem class oder struct. Stattdessen wird eine Eigenschaft deklariert, die keine Standardimplementierung hat, sondern in jedem Typ implementiert werden muss, der die Schnittstelle implementiert:

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

Eine Schnittstelle kann von einer oder mehreren Basisschnittstellen erben. Wenn eine Schnittstelle eine Methode überschreibt die in einer Basisschnittstelle implementiert ist, muss sie die Syntax der expliziten Schnittstellenimplementierung verwenden.

Wenn eine Basistypliste sowohl eine Basisklasse als auch Schnittstellen umfasst, muss die Basisklasse zuerst in der Liste stehen.

Eine Klasse, die eine Schnittstelle implementiert, kann Member dieser Schnittstelle explizit implementieren. Auf ein explizit implementiertes Element kann nicht über eine Klasseninstanz zugegriffen werden, sondern nur über eine Instanz der Schnittstelle. Außerdem kann auf Standardschnittstellenmember nur über eine Instanz der Schnittstelle zugegriffen werden.

Weitere Informationen zur expliziten Implementierung finden Sie unter Explizite Schnittstellenimplementierung.

Beispielschnittstellenimplementierungen

Das folgende Beispiel veranschaulicht die Schnittstellenimplementierung. In diesem Beispiel enthält die Schnittstelle die Eigenschaftendeklaration, und die Klasse enthält die Implementierung. Eine beliebige Instanz einer Klasse, die IPoint implementiert, hat die ganzzahligen Eigenschaften x und y.

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#-Sprachspezifikation

Weitere Informationen finden Sie im Abschnitt Schnittstellen der C# -Sprachspezifikation und in der Featurespezifikation für Standardschnittstellenmember – C# 8.0.

Siehe auch