Frage

Ich habe eine abstrakte Klasse mit einer abstrakten Eigenschaft, die sowohl Get als auch Set haben soll. Ich weiß, ich werde immer in der Lage sein wollen erhalten Diese Eigenschaft aus abgeleiteten Klassen, aber es gibt einige Fälle, in denen es keinen Sinn ergibt einstellen Diese Eigenschaft in bestimmten Arten von abgeleiteten Klassen.

Ich kann den Set Accessor in einer abgeleiteten Klasse nicht einfach weglassen (siehe Code -Beispiel unten). Ich könnte den festgelegten Accessor in einem abgeleiteten Klassen überschreiben, um nichts mit den vom Benutzer übergebenen Werten zu tun. Aber gibt es eine andere Möglichkeit, die Eigenschaft tatsächlich in einer bestimmten abgeleiteten Klasse zu lesen? Letztendlich zeige ich diese Eigenschaften in einem Eigenschaftsnetz und möchte nicht, dass der Benutzer Werte in ein Feld eingibt, das nichts tun wird. Vielleicht schreibe ich die Eigenschaft nur in bestimmten abgeleiteten Klassen als Lesen zu?

Außerdem würde ich mir auch wirklich nicht mit einem der Typ -Deskriptor -Dinge, um Eigenschaften in einem Eigenschaftsnetz anzuzeigen, wie z. B. überragende iCustomtyPedeskriptor, nicht anlegen.

public abstract class MyClass
{
    public abstract string MyProperty
    {
        get;
        set;
    }
}

public abstract class MyDerivedClass
{
    public override string MyProperty
    {
        //VS complains that the Set accessor is missing
        get;
    }
}
War es hilfreich?

Lösung

Sie sollten das nicht tun. Was Sie sagen, indem Sie Ihren Getter und Setter in der abstrakten Klasse definieren, lautet: "Sie müssen dies implementieren, wenn Sie von mir erben möchten." Dann fragen Sie: "Wie kann ich eine abgeleitete Klasse erstellen, die diese Regel ignoriert."

Die Antwort ist, dass wenn Sie eine Situation haben, in der jede abgeleitete Klasse einen Getter benötigt, dies in die abstrakte Klasse einfügen und die abgeleitete Klasse entscheiden lassen, ob sie einen Setter implementieren oder nicht, indem sie ihn aus der abstrakten Klasse herauslassen.

Oder alternativ können Sie zwei weitere Klassen erstellen, die aus der anfänglichen abstrakten Klasse stammen, eine, die den Setter implementiert, und eine, die nicht die abgeleitete Klasse verallgemeinert hat, die sinnvoll ist, aber das ist Overkill, denke ich.

Andere Tipps

Sieh aus wie du suchst Readonly (wahr)] AttributDies wird als Readonly -Grid Ihr Eigentum angezeigt.
Aber in Ihrer Klasse können Sie es als übliche Eigenschaft verwenden (mit Lesen und Schreibmöglichkeiten)

Du solltest benutzen abstract nicht override:

public abstract class MyClass
{
    public abstract string MyProperty
    {
        get;
        set;
    }
}

public abstract class MyDerivedClass
{
    public abstract string MyProperty
    {
        get;
    }
}

Aber wie @JP geschrieben hat, sollten Sie das nicht tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top