Können Erweiterungsmethoden auf Schnittstellen angewendet werden?

123

Ist es möglich, eine Erweiterungsmethode auf eine Schnittstelle anzuwenden? (C # Frage)

Damit soll beispielsweise Folgendes erreicht werden:

  1. Erstellen Sie eine ITopology-Schnittstelle

  2. Erstellen Sie eine Erweiterungsmethode für diese Schnittstelle (z. B. public static int CountNodes (diese ITopology topologyIf)).

  3. Wenn Sie dann eine Klasse (z. B. MyGraph) erstellen, die ITopology implementiert, hat sie automatisch die Erweiterung Count Nodes.

Auf diese Weise müssten die Klassen, die die Schnittstelle implementieren, keinen festgelegten Klassennamen haben, um mit dem übereinzustimmen, was in der Erweiterungsmethode definiert wurde.

Greg
quelle

Antworten:

188

Natürlich können sie; Der größte Teil von Linq basiert auf Schnittstellenerweiterungsmethoden.

Schnittstellen waren tatsächlich eine der treibenden Kräfte für die Entwicklung von Erweiterungsmethoden; Da sie keine eigene Funktionalität implementieren können, sind Erweiterungsmethoden die einfachste Möglichkeit, tatsächlichen Code mit Schnittstellendefinitionen zu verknüpfen.

In der Enumerable- Klasse finden Sie eine ganze Sammlung von Erweiterungsmethoden, die darauf basierenIEnumerable<T> . Um eine zu implementieren, ist es dasselbe wie eine für eine Klasse zu implementieren:

public static class TopologyExtensions
{
    public static void CountNodes(this ITopology topology)
    {
        // ...
    }
}

Erweiterungsmethoden unterscheiden sich in Bezug auf Schnittstellen nicht besonders. Eine Erweiterungsmethode ist nur eine statische Methode, bei der der Compiler syntaktischen Zucker anwendet, um den Eindruck zu erwecken, dass die Methode Teil des Zieltyps ist.

Aaronaught
quelle
33
Betreff: "Natürlich" - Ich denke, die Frage enthüllt den Architekturgeruch, den Sie implizit erwähnen. Wenn Sie Erweiterungen für Schnittstellen haben können, warum können Schnittstellen keine implementierten Methoden enthalten? Es ist verständlich zu denken, dass entweder Schnittstellen konkrete Methoden haben sollten oder, wenn Sie wissen, dass sie nicht können, dass Erweiterungsmethoden nicht als praktikabler Kludge zugelassen werden sollten. (Aber sie sind es. Sie argumentieren nicht mit Ihrer ausgezeichneten Antwort, sondern nur mit "natürlich" und dem Link zu IEnum, nicht zu LINQ .; ^ D) Da stinkt etwas!
Ruffin
Möchten Sie dem @ ruffin-Kommentar Nachrichten hinzufügen, dass Sie jetzt Standardimplementierungen zu C # -Schnittstellenmethoden hinzufügen können. Quelle: devblogs.microsoft.com/dotnet/…
Vinigas
@ Ruffin Ich fand das die verwirrendste architektonische Entscheidung in C #. Manchmal führt dies dazu, dass die Struktur der halben Klasse und der halben Schnittstelle überall durcheinander gerät. Dennoch glaube ich, dass es nützlich sein kann, wenn man es aus Sicht der funktionalen Programmierung betrachtet und dazu verwendet, Dienstprogramme in Schnittstellen einzuführen, anstatt Funktionen zu implementieren.
Guney Ozsan