design-rationale

___ answer1062493 ___

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.

    
___ answer1062623 ___

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 .

    
___ answer1062485 ___

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 .     

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

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.

    
___ answer1062517 ___

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.

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123helper ___ Zusätzliche Funktionalität, die nicht in einer Klasse definiert ist, an der der Helfer arbeitet. ___ answer1062496 ___

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. %code%

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.

    
___ qstntxt ___

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%     
___ tag123interface ___ Eine Schnittstelle bezieht sich auf den Interaktionspunkt zwischen Komponenten. Schnittstellen sind sowohl auf der Hardware- als auch auf der Softwareebene anwendbar. Im Allgemeinen stellt eine Schnittstelle einen Vertrag offen, ohne die zugrunde liegenden Implementierungsdetails offenzulegen. In objektorientierter Programmierung definieren Schnittstellen abstrakte Typen, die das Verhalten offen legen, aber keine Logik enthalten. Die Implementierung wird durch die Klasse oder den Typ definiert, der die Schnittstelle implementiert. ___ tag123designrational ___ hilf uns dieses Wiki zu bearbeiten ___ answer1062512 ___

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.

    
___
4
Antworten

Warum hat die Standardbibliothek find und find_if?

Konnte nicht find_if nur eine Überladung von find sein? So machen std::binary_search und Freunde es ...     
20.08.2010, 17:16
7
Antworten

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

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 Plug...
30.06.2009, 08:39