Warum sollte C # (oder .NET) es uns nicht erlauben, eine statische / geteilte Methode in eine Schnittstelle einzufügen?

7

Warum sollte C # (oder .NET) uns nicht erlauben, eine statische / geteilte Methode innerhalb einer Schnittstelle zu setzen?

scheint aus zu duplizieren hier . aber meine Idee ist ein bisschen anders, ich möchte nur einen Helfer für meine Plugins (Schnittstelle) setzen

sollte C # zumindest diese Idee nicht zulassen?

%Vor%     
Hao 30.06.2009, 08:39
quelle

7 Antworten

11

Die Idee einer Schnittstelle ist es, einen Vertrag darzustellen, nicht eine Implementierung.

Ich kann mich nicht daran erinnern, ob IL tatsächlich statische Methoden mit Implementierungen in Interfaces erlaubt - ich habe den hinterhältigen Verdacht, dass dies der Fall ist -, aber das verwirrt das Konzept etwas.

Ich kann Ihren Standpunkt sehen - es ist manchmal nützlich zu wissen, welche Hilfsmethoden verfügbar sind, die mit einer Schnittstelle verbunden sind (und Erweiterungsmethoden sind dort besonders relevant), aber ich würde sie trotzdem gerne in eine separate Klasse stellen halte das mentale Modell sauber.

    
Jon Skeet 30.06.2009, 08:44
quelle
6

Ich bin mehrmals darauf gestoßen und habe etwas recherchiert. Der traurige Teil ist, IL unterstützt dies tatsächlich. Ich war so frustriert, dass ich einen Blogeintrag darüber geschrieben habe. Sie finden es hier .

    
Jonathan van de Veen 30.06.2009 09:10
quelle
2

Für Ihren Zweck wird es viel besser sein, die Plugin-Schnittstelle von der Plugin-Lader-Implementierung zu entkoppeln: das wird Ihr Design viel weniger gekoppelt und zusammenhängender machen (wodurch die Komplexität reduziert wird).

Was "statische Methoden in der Schnittstelle" betrifft, siehe dies .

Und als Nebenbemerkung: Sie wollen nicht wirklich eine neue Plugin-Architektur erfinden: Schauen Sie sich MEF .     

Anton Gogolev 30.06.2009 08:42
quelle
2

Sieh dir meinen Blogeintrag zu statischen Methoden an, die in Interfaces implementiert sind (Entschuldigung für die schamlose Selbstreferenz)

[defekter Link http: / ...]

entfernt

dotnetjunkies Website wird von totaldevpro gestoßen ... so ist die Google-Cache-Version die einzige verfügbare

Bearbeiten: Ich habe eine Cache-Version eingefügt, die ich gefunden habe:

[...]

Verwenden Sie ILAsm, um Folgendes zu kompilieren:

%Vor%

Dieser Code kann dann

aufgerufen werden %Vor%

Intellisense (VS) funktioniert hier nicht wie erwartet. Es erkannte die statische Methode als eine Instanzmethode der Schnittstelle, und der Code (wenn er den IntelliSense-Prompts folgt) sieht so aus, als würde er kompilieren. Der C # -Compiler (MS C #) kompiliert den Code nicht, da C # keine implementierten statischen Methoden auf Schnittstellen unterstützt und C # nur über Reflektion aufgerufen werden kann.

Ich habe nicht mit anderen IDEs wie SharpDevelop getestet ... also habe noch keine Ahnung, wie es mit dieser Situation umgehen würde.

    
MaLio 30.06.2009 09:48
quelle
1

Eine Schnittstelle ist genau das, eine Schnittstelle. Es ist nicht dazu gedacht, das Verhalten zu beschreiben. Wenn eine Klasse eine Schnittstelle implementiert, sagt die Klasse nur "Ich verspreche, dass ich Methoden / Ereignisse / etc mit diesen Signaturen versehe".

Was Sie wollen, ist eine Schnittstelle ohne die statische Methode und eine abstrakte Basisklasse, die die Schnittstelle und die statische Methode implementiert. Dann können andere Klassen von der Basisklasse erben und die Methodenimplementierungen der Schnittstelle ändern. Aber auch das ist ein fragwürdiges Design.

    
colithium 30.06.2009 08:48
quelle
0

statische Methoden sind dem Typ zugeordnet, in dem sie deklariert werden und nicht für das Überschreiben relevant sind. Wenn Sie eine statische Methode an eine Schnittstelle anhängen könnten, müssten Sie diese über die Schnittstelle selbst referenzieren, z. ITaskPlugin.GetPlugins(...)

Was Sie tun möchten, ist entweder:

1) Fügen Sie Ihre Methode in eine abstrakte Basisklasse ein, da die Schnittstellen nicht dafür ausgelegt sind, Implementierungscode zu enthalten, oder

2) Erstellen Sie eine Erweiterungsmethode, die für die Schnittstelle gilt und Sie dann darauf zugreifen können, ohne eine Basisklasse verwenden zu müssen.

    
Nathan Ridley 30.06.2009 08:44
quelle
0

Der Zweck einer Schnittstelle besteht darin, die Schnittstelle eines Objekts zu deklarieren, über die auf sie zugegriffen werden kann. Aufgrund dessen, dass dies der einzige Zweck ist, würde es keinen Sinn machen, Code in einer Schnittstelle zu platzieren. Wenn Sie einer Schnittstelle noch etwas Code hinzufügen möchten, können Sie Erweiterungsmethoden verwenden.

    
Oliver Hanappi 30.06.2009 08:47
quelle