Ich liebe Generika in C#, aber manchmal mit ihnen zu arbeiten kann ein bisschen kompliziert werden. Auf das Problem unten stoße ich hin und wieder. Gibt es eine Möglichkeit, dieses Szenario zu vereinfachen? Ich kann nicht sehen, wie, aber ich bin der Hoffnung, jemandIst es möglich, geschachtelte Generics in C# zu vereinfachen?
Bei drei Basisklassen kann :):
public abstract class Inner
{
}
public abstract class Outer<T>
where T : Inner
{
}
public abstract class Handler<TOuter, TInner>
where TOuter : Outer<TInner>
where TInner : Inner
{
public abstract void SetValue(TInner value);
}
Und einige einfache Implementierungen: meine Frage
public class In : Inner
{
}
public class Out : Outer<In>
{
}
public class HandleOut : Handler<Out, In>
{
public override void SetValue(In value) { }
}
Jetzt ist: Für HandleOut
, der Typ von TInner
ist durch den Typ "Out" gegeben, so gibt es eine Möglichkeit, die Definition von HandleOut
zu etwas wie public class HandleOut : Handler<Out>
zu vereinfachen und immer noch den inneren Typ als Parameter zuverwenden zu können?
Dies ist ein sehr einfaches Beispiel, aber manchmal bekomme ich eine lange Liste von generischen Typen in Definitionen, wenn normalerweise alle logisch vom ersten Typ abgeleitet werden können. Gibt es Tricks, die ich vermisse?
Ich habe Ihren Code so korrigiert, dass er kompiliert wird. Kannst du bitte überprüfen, ob es im POV deiner Frage korrekt ist? – Enigmativity
Sie stimmen zwar nicht zu 100% mit dem überein, was Sie sich fragen, aber vielleicht möchten Sie einen Blogeintrag von Eric Lippert mit dem Titel [Warum sind generische Constraints nicht vererbt?] Lesen (http://ericlippert.com/2013/07/15/ warum-sind-generische-constraints-not-geerbt /) (und in der Tat, die Tatsache, dass sie nicht geerbt sind, warum Enigmatismus Ihren Code reparieren musste, um * more * Einschränkungen hinzuzufügen) –
Vielen Dank, @Enigmatismus. Ich habe den Code im Handumdrehen geschrieben - Ihre Änderungen entsprechen genau meinen Gedanken :) –