Frage

Ist es möglich, so etwas zu tun?

class A
{
    public virtual string prop
    {
        get
        {
            return "A";
        }
    }
}
class B: A
{
    private string X;
    public override string prop
    {
        get
        {
            return X;
        }
        set
        {
            X = value;
        }
    }
}

Das heißt, die Basisklasse mit nur einem GET-Accessor eine virtuelle Eigenschaft bietet, aber das Kind Klasse überschreibt die GET und bietet auch eine SET.

Das aktuelle Beispiel lässt sich nicht kompilieren, aber vielleicht etwas hier fehlt mir.

am: Um zu klären, nein, ich will nicht mit neuem neu zu definieren. Ich möchte ein neues Accessor hinzuzufügen. Ich weiß, dass es nicht in der Basisklasse war, so kann es nicht außer Kraft gesetzt werden. OK, lassen Sie mich versuchen zu erklären, wie es ohne den syntaktischen Zucker aussehen:

class A
{
    public virtual string get_prop()
    {
            return "A";
    }
}
class B: A
{
    private string X;
    public override string get_prop()
    {
        return X;
    }
    public virtual string set_prop()
    {
        X = value;
    }
}
War es hilfreich?

Lösung

Nein, das ist nicht möglich. Leider kann man nicht einmal außer Kraft setzen und die Zugriffsebene ändern (von geschützt öffentlich zum Beispiel), wie auf den MSDN . Ich würde empfehlen, dass Sie den Code / Klasse etwas betrachten Restrukturierung und suchen eine alternative Möglichkeit, diese Aufgabe zu erfüllen wie die set-Accessor mit der Deklaration geschützt Modifikator eine SetProperty Methode in der abgeleiteten Klasse.

Andere Tipps

Nein, es gibt keine Möglichkeit, dies zu tun. Denken Sie darüber nach, wie der syntaktische Zucker Ihrer virtuellen Eigenschaft wird mit behandelt werden, das heißt es wird umgewandelt:

public virtual string get_prop();

Es gibt keine set_Prop Methode außer Kraft zu setzen, und Sie können nicht eine Methode überschreiben, die nicht existiert.

Sie können die Basisklassenimplementierung ausblenden, indem Sie das ‚neue‘ Schlüsselwort in der abgeleiteten Klasse. Folgendes sollte kompiliert erfolgreich:

class A
{
    public virtual string prop
    {
        get
        {
            return "A";
        }
    }
}
class B : A
{
    private string X;
    public new string prop
    {
        get
        {
            return X;
        }
        set
        {
            X = value;
        }
    }
}

ein neues Feld Einführung schmatzt chaotisch. Und so oder so müssen Sie vorsichtig sein, nicht Polymorphismus und Vererbung zu brechen (was ist, wenn die Basis-Klasse im Gespräch mit dem privaten Bereich?).

Bei einer neuen Zugriffs während zwingende Zugabe; die einfache Antwort ist „Nein, man kann nicht“. Wenn Sie außer Kraft setzen, können Sie nur die vorhandenen Zugriffsmethoden auswirken, denn das ist, was für das Mitglied in der virtuellen Tabelle definiert ist (ein überschriebene Mitglied ist immer noch „im Besitz“ von der Basis / Klasse erklärt, nicht die übergeordnete Klasse).

Eine Option (nicht ideal) ist die Eigenschaft neu zu erklären, aber Sie müssen noch einen Weg, um die Basis-Klasse zu sprechen, nach unten. Also, wenn die Accessor in der Basis-Klasse sind protected:

class A
{
    public string prop
    {
        get;
        protected set;
    }
}
class B : A
{
    public new string prop
    {
        get { return base.prop; }
        set { base.prop = value; }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top