| 

.NET C# Java Javascript Exception

1
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?
04.03.2011
smartic 510 1 8
3 Antworten
1
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.
05.03.2011
Matthias Hlawatsch 13,2k 4 9
0
Hi,

möchtest Du folgendes tun können?
public class Core<T> where T : Component
{ /* Basisfunktionalitäten */ }

public class UserCtl : UserControl
{ }

public class ComponentClass : Component
{ }

public class DerivedComponent : Core<ComponentClass>
{ }

public class DerivedControl : Core<UserCtl>
{ }


Das funktioniert, weil ein Usercontrol von Component erbt.

Vielleicht steh ich aber auch grade auf dem Schlauch.
Was für gleichen Code willst Du für beide Arten bereitstellen?

Kann man das Design vielleicht auch anders gestalten?
04.03.2011
KHoffmann 939 6
0
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
where T : Component
irritiert hat.
05.03.2011
smartic 510 1 8

Stelle deine .net-Frage jetzt!