7 Stimmen

Bereitstellung abstrakter Klassenvariablen aus einer Unterklasse

Was ist der "richtige" Weg, um einen Wert in einer abstrakten Klasse aus einer konkreten Unterklasse bereitzustellen?

d. h., sollte ich dies tun:

abstract class A {
    private string m_Value;

    protected A(string value) {
        m_Value = value;
    }

    public string Value {
        get { return m_Value; }
    }
}

class B : A {
    B() : this("string value") {}
}

oder dies:

abstract class A {

    protected A() { }

    public abstract string Value { get; }
}

class B : A {
    B() {}

    public override string Value {
        get { return "string value"; }
    }
}

oder etwas anderes?

Und sollten andere Dinge getan werden, wenn die Value Eigenschaft nur in der abstrakten Klasse verwendet wird?

0voto

Ryan Brunner Punkte 14463

Ein großer Vorteil des zweiten Falles besteht darin, dass eine Unterklasse ein Verhalten für die Eigenschaft Wert definieren kann, das komplexer sein kann als ein einfacher Einzelwert. Zum Beispiel könnten Sie den Wert auf der Grundlage anderer Felder berechnen wollen, die die Unterklasse definiert. Mit dem ersten Ansatz ist dies nicht möglich, aber der zweite Ansatz erlaubt dies.

0voto

munificent Punkte 11450

Ich bevorzuge die zweite Variante. Damit können Sie einen Wert bereitstellen, ohne der Klasse ein eigenes Feld hinzuzufügen, wenn der Wert konstant ist oder zur Laufzeit berechnet werden kann. Je weniger Status Sie haben (weniger Felder), desto wartungsfreundlicher wird der Code sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X