Ich habe eine C ++ - DLL eines Drittanbieters, die ich von C # aus aufrufe.
Die Methoden sind statisch.
Ich möchte es abstrahieren, um einige Unit-Tests durchzuführen, also habe ich eine Schnittstelle mit den darin enthaltenen statischen Methoden erstellt, aber jetzt sind meine Programmfehler mit:
Der Modifikator 'statisch' ist für dieses Element nicht gültig
MyMethod cannot be accessed with an instance reference; qualify it with a type name instead
Wie kann ich diese Abstraktion erreichen?
Mein Code sieht so aus
private IInterfaceWithStaticMethods MyInterface;
public MyClass(IInterfaceWithStaticMethods myInterface)
{
this.MyInterface = myInterface;
}
public void MyMethod()
{
MyInterface.StaticMethod();
}
Antworten:
Sie können keine statischen Elemente auf einer Schnittstelle in C # definieren. Eine Schnittstelle ist ein Vertrag für Instanzen .
Ich würde empfehlen, die Benutzeroberfläche so zu erstellen, wie Sie sie derzeit sind, jedoch ohne das statische Schlüsselwort. Erstellen Sie dann eine Klasse
StaticIInterface
, die die Schnittstelle implementiert und die statischen C ++ - Methoden aufruft. Um Unit-TestsFakeIInterface
durchzuführen , erstellen Sie eine weitere Klasse , die ebenfalls die Schnittstelle implementiert, aber das tut, was Sie für Ihre Unit-Tests benötigen.Sobald Sie diese beiden Klassen definiert haben, können Sie die für Ihre Umgebung benötigte erstellen und an
MyClass
den Konstruktor übergeben.quelle
An interface is a contract, not an implementation.
- das ist wahr, aber völlig irrelevant ( keine Folge ), da die statische Methode nicht Teil der Implementierung selbst ist - die Implementierung basiert per Definition auf Daten , auf die wiederum für statische Mitglieder nicht zugegriffen werden kann.An interface type definition can define and implement static methods (see §8.4.3) since static methods are associated with the interface type itself rather than with any value of the type.
- Bedenken Sie, dassstatic
Mitglieder normalerweise Gebrauchsmethoden sind .An interface is a contract, not an implementation
nutzlos ist, manchmal hilft ein bisschen Kontextualisierung wirklich. Und ich stimme voll und ganz zustatic method is not a part of implementation itself
, statische Methoden haben eine Implementierung, sie werden nur dann Teil der Implementierung, wenn sie als Implementierung bei der Implementierung einer anderen Methode verwendet werden. Mein Wörterbuch basiert jedoch auf dem, was ich gelernt habe. Soweit ich weiß, variiert die Terminologie auch je nach Programmiersprache. Statische Methoden können keine Schnittstellen sein, da es ohnehin nur eine Implementierung geben kann.IPerson
Vertrag, der besagt,GetCountry
dass der Name des Herkunftslandes der Person angegeben wird ...FrenchPerson
Unternehmen sagen alle "Frankreich" undGermanPerson
alle "Deutschland", was auch nützlich ist, wenn verschiedene Arten von Unternehmen dieselbe (Daten-) Tabelle wie MS verwenden Azure eins, sagen wirConnection
,Post
undComment
werden in derUsers
AzureTable gespeichert , so dass Baumentitäten eine gemeinsame Information haben,IUsers
könnteGetTableName
statische Methode haben ...Schnittstellen können keine statischen Elemente haben und statische Methoden können nicht als Implementierung von Schnittstellenmethoden verwendet werden.
Sie können eine explizite Schnittstellenimplementierung verwenden:
Alternativ können Sie einfach nicht statische Methoden verwenden, auch wenn diese nicht auf instanzspezifische Mitglieder zugreifen.
quelle
Statische Mitglieder sind in der CLR vollkommen legal, nur nicht C #.
Sie können etwas Kleber in IL implementieren, um die Implementierungsdetails zu verknüpfen.
Sie sind sich nicht sicher, ob der C # -Compiler das Aufrufen zulassen würde?
Siehe: 8.9.4 Definition des Schnittstellentyps ECMA-335.
quelle
CLS Rule 19: CLS-compliant interfaces shall not define static methods, nor shall they define fields.
es weiter, dass es für CLS-konforme Verbraucher in Ordnung ist, diese Art von Schnittstellen abzulehnen. Ich habe vor ungefähr einem Jahr versucht, eine statische Methode für eine Schnittstelle aufzurufen, und der C # -Compiler hat sie nicht kompiliert.Common Language Specification (CLS) is a set of basic language features that .Net Languages needed.... When there is a situation to communicate Objects written in different .Net Complaint languages , those objects must expose the features that are common to all the languages.
Wenn es beim CLS um Interoperabilität zwischen verschiedenen .NET-Sprachen geht und C # keine statischen Mitglieder auf einer Schnittstelle zulässt, würde das CLS diese ebenfalls verbieten, um sicherzustellen, dass Bibliotheken vorhanden sind Andere .NET-Sprachen können von C # aus aufgerufen werden.Sie können statische Methoden in c # 8 definieren, müssen jedoch einen Standardtext dafür deklarieren.
oder wenn Sie keinen Standardkörper haben möchten, lösen Sie einfach eine Ausnahme aus:
quelle
Sie könnten es mit Nachdenken aufrufen:
quelle
C # "Ten" ermöglicht neben Rollen auch statische Elemente auf Schnittstellen . Dies ist ein großer Fortschritt, da auch eine generische Überlastung des Bedieners ohne Reflexion möglich ist. Hier ist ein Beispielausschnitt, wie es funktioniert, unter Verwendung des klassischen Monoid-Beispiels, das nur Jargon ist, um "etwas zu sagen, das hinzugefügt werden kann". Direkt aus Mads Torgersen: C # in die Zukunft 45:30 :
Zusätzliche Ressourcen:
Jeremy Bytes: Statische Mitglieder der C # 8-Schnittstelle
BEARBEITEN
Dieser Beitrag, in dem ursprünglich angegeben wurde, dass statische Mitglieder der Benutzeroberfläche in C # 8.0 hinzugefügt werden , was nicht stimmt. Ich habe Mads Torgersens Worte im Video falsch interpretiert. Der offizielle C # 8.0-Leitfaden spricht noch nicht über statische Schnittstellenmitglieder, aber es ist klar, dass sie schon ziemlich lange daran arbeiten.
quelle
Warum Sie keine statische Methode für eine Schnittstelle haben können: Warum erlaubt C # statischen Methoden nicht, eine Schnittstelle zu implementieren?
Ich würde jedoch vorschlagen, die statischen Methoden zugunsten von Instanzmethoden zu entfernen. Wenn dies nicht möglich ist, können Sie die statischen Methodenaufrufe in eine Instanzmethode einbinden. Anschließend können Sie eine Schnittstelle dafür erstellen und daraus Ihre Komponententests ausführen.
dh
quelle
C # 8 Ermöglicht statische Mitglieder auf Schnittstellen
Schnittstelle (C # Referenz)
Z.B
quelle