Hallo, ich bin auf der Suche nach einer eleganten Variante einer Componente und UserControl gleichen Code zu zuführen ohne für beide extra eine Basisklasse zu erschaffen und alles doppelt zu implementieren oder über eine Eigenschaft zu halten.
Meine folgende Überlegung ...
public class Core<T> : T where T : Component { ... }
... scheiterte mit der Fehlermehldung:
Die Ableitung von "T" ist nicht möglich, weil es sich um einen Typparameter handelt.
Ist es Grundsätzlich nicht Möglich oder habe ich irgent was übersehen?
Also, wenn ich Dich richtig verstehe, stellst Du Dir das so vor:
public class Core<T> : T where T : Component { // Funktionalität, die Du sowohl in eigenen Components // als auch in eigenen UserControls verwenden willst ... }
/// eine Klasse, die von Component abgeleitet ist, /// aber auch die Funktionalität aus Core<T> erbt public class DerivedComponent : Core<Component> { }
/// eine Klasse, die von UserControl abgeleitet ist, /// aber auch die Funktionalität aus Core<T> erbt public class DerivedControl : Core<UserControl > { }
Tut mir leid, aber das geht tatsächlich nicht. Du kannst von einem Typparameter nicht ableiten.
Ich sehe zwei Auswege:
entweder Du wechselst zu C++, wo Mehrfachvererbung möglich ist ...
... oder Du beherzigst eine gängige OO-Design-Empfehlung: Favour Composition over Inheritance und bindest den Code aus Core<T> per Delegation ein (auch wenn das etwas mehr Tipparbeit ist). Je nachdem, was genau Du vorhast, kann es auch eine Option sein, beides zu kombinieren: Du schreibst zwei Basisklassen MyComponent und MyUserControl, die von Component bzw. UserControl erben, auf eine Core-Klasse delegieren und dann die Vererbungs-Basis für deine eigenen Components und UserControls darstellen.
Hallo Matthias, auf die Idee bin ich nicht gekommen, dass dies eine versteckte Mehrfachvererbung sein kann. :-) Das ist also auch der Grund, dass dieses Konstrukt dann nicht geht.
Wie du schon gesagt hast, muss ich wohl bei der Tipparbeit bleiben. Die Kombination aus WhiteBox und Blaxbox besteht bereits. Spezielle Componenten/Usercontrols leiten von der Core(leider keine Generics :-() ab und die Core ermöglicht mir das einfache zusammensetzen von den Components und UserControls über Events.
@KHoffmann: Matthias hat die Sachlage erkannt. Ich wollte das Core vom T erbt. Ich denke mal, dass die Generics Einschränkung