Hallo zusammen.
dachte eigentlich ich wäre Fit in Generics..
aber warum funktioniert das nicht :
public interface IControlRenderer
{
LabelControl Control { get; }
}
public abstract class ControlRenderBase<TLabelControl> :DrawingVisual,IControlRenderer where TLabelControl : LabelControl
{
public TLabelControl Control { get; set; }
}
Fehlermeldung:
'DrawingVisualSample.ControlRenderBase<TLabelControl>' does not implement interface member 'DrawingVisualSample.IControlRenderer.Control'. 'DrawingVisualSample.ControlRenderBase<TLabelControl>.Control' cannot implement 'DrawingVisualSample.IControlRenderer.Control' because it does not have the matching return type of 'LabelDesigner.LabelControl'.
Hat es doch! Grml.
Der Rückgabetyp der Property muss exakt mit der im Interface deklarierten Property übereinstimmen. Implementier einfach das Interface explizit wie folgt:
public interface IControlRenderer
{
LabelControl Control { get; }
}
public abstract class ControlRenderBase<TLabelControl> :DrawingVisual,IControlRenderer where TLabelControl : LabelControl
{
public TLabelControl Control { get; set; }
LabelControl IControlRenderer.Control
{
get { return this.Control; } // this.Control gibt den Wert der oben definierten Property zurück
}
}
Auf diese Weise hast du die generische Property, wenn du über die Klasse selbst zugreifst und die nicht-generische Property, wenn du über das Interface zugreifst.
Ja, Du hast recht, der Kaffee hat noch nicht gewirkt.
Das kann nicht funktionieren weil ich ja als TypArgument von ControlRenderBase auch alle Ableitungen von LabelControl benutzen kann, was dann aber nicht mehr dem Interface entspräche.
Danke.