Geben Sie Einschränkungen für Implementierungen generischer Member nicht generischer Schnittstellen in C # ein.

8

Sagen wir, ich habe eine solche Schnittstelle:

%Vor%

Gibt es eine Möglichkeit, die DoSomething-Methode mit Typ-Constraint zu implementieren? Offensichtlich wird das nicht funktionieren:

%Vor%

Das wird offensichtlich nicht funktionieren, weil DoSomething () den Vertrag von IAwesome nicht vollständig erfüllen wird - es funktioniert nur für eine Teilmenge aller möglichen Werte des Typparameters T. Gibt es eine Möglichkeit, diese Arbeit zu vermeiden einige "schwarze Magie" (was werde ich als letztes Mittel tun, wenn die Antwort nein ist)?

Ehrlich gesagt, glaube ich nicht, dass es möglich ist, aber ich frage mich, was ihr denkt.

BEARBEITEN : Die fragliche Schnittstelle ist System.Linq.IQueryProvider , so dass ich die Schnittstelle selbst nicht ändern kann.

    
Tamas Czinege 13.02.2010, 21:23
quelle

3 Antworten

7

Nein, das kann nicht funktionieren, da dies bedeuten würde, dass der Vertrag für IAwesome nicht (vollständig) erfüllt wäre.

Solange IncrediblyAwesome<T> IAwesome implementiert, darf man dies tun:

%Vor%

Offensichtlich konnte dies mit Ihrer zusätzlichen Einschränkung nicht funktionieren, da der Benutzer von IAwesome die Einschränkungen nicht kennen kann.

In Ihrem Fall ist die einzige Lösung, die ich mir vorstellen kann, die Laufzeitüberprüfung:

%Vor%     
Lucero 13.02.2010, 21:34
quelle
2

Würde so etwas nicht funktionieren?

%Vor%

Ich bin mir nicht sicher, ob das kompiliert.

    
Zyphrax 13.02.2010 21:26
quelle
1

Wie Sie bereits erwähnt haben, kann eine solche Lösung nicht funktionieren.

Außerdem verletzt Ihr Beispiel den Vertrag auf andere Weise: Eine Instanz von IncrediblyAwesome ist immer an einen bestimmten Nachkomme von PonyFactoryFactoryFacade gebunden (übrigens wäre ich wirklich am Zweck interessiert) dieser Klasse :-)). Daher wäre die konkrete Implementierung von DoSomething nicht eine generische Methode wie in der Schnittstelle angegeben, sondern gibt immer einen einzelnen Typ zurück. Du kannst nicht schreiben:

%Vor%

obwohl beide Fassaden-Fabriken von PonyFactoryFactoryFacade ... abstammen.

Noch ein Kommentar: Ich würde mich von Black Magic Casting fernhalten, da diese Probleme in Ihrem Design liegen und nicht nur ein Manko von C # ...

    
MartinStettner 13.02.2010 21:43
quelle

Tags und Links