Ich arbeite durch einen Fehler. Bei der Neuerstellung des Fehlers für das folgende Beispiel konnte ich feststellen, warum das Problem auftritt. Aber ich bin auf der Suche nach einer besseren Lösung. So das folgende Programm gegeben:Wie kann T während der Implementierung einer Schnittstelle korrekt von einer generischen Methode zurückgegeben werden?
bar
bar
Aber was ich bin immer ist: wie diese vereinfachte
foo
bar
sehen das Problem ist es
public interface IFoo<T> {
T OutputType(T param);
}
class Foo : IFoo<Foo> {
public virtual Foo OutputType(Foo param) {
Console.WriteLine("foo");
return param;
}
}
class Bar : Foo, IFoo<Bar> {
public virtual Bar OutputType(Bar param) {
Console.WriteLine("bar");
return param;
}
}
class Program {
static void Main(string[] args) {
Bar bar = new Bar();
CallOutputType(bar);
bar.OutputType(bar);
}
static void CallOutputType<T>(T t) where T : Foo {
t.OutputType(t);
}
}
ich die Ausgabe zu sein, erwartete offensichtlich, dass Bar.OutputType nicht überschreibt Foo.OutputType. Was sind meine besten Möglichkeiten, dieses Design zu verbessern? Bar.OutputType kann nicht überschrieben werden Foo.OutputType, weil die Signaturen unterschiedlich sind. Ändern der Signatur von Bar.OutputType passen Foo.OutputType wird nicht funktionieren, weil dann Bar nicht IFoo werden implimenting.
Hmm, ich versuche, dies jetzt zu testen, was ich glaube, ich könnte Am Ende ist das in CallOutputType - ((IFoo) t) .OutputType (t); Ich kann die Methodenkonstante aus anderen Gründen nicht ändern. –
Bob
Vielen Dank, dass Sie mich in die richtige Richtung weisen, indem Sie die Schnittstelle verwenden, um die Methode aufzurufen. – Bob