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.
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:
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%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:
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 # ...