Laden...

Implementation eines Interfaces in Generischer Klasse

Erstellt von unconnected vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.124 Views
unconnected Themenstarter:in
849 Beiträge seit 2006
vor 10 Jahren
Implementation eines Interfaces in Generischer Klasse

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.

D
96 Beiträge seit 2012
vor 10 Jahren

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.

unconnected Themenstarter:in
849 Beiträge seit 2006
vor 10 Jahren

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.