3 Stimmen

Zugriff auf eine statische Eigenschaft eines untergeordneten Objekts in einer übergeordneten Methode

Angenommen, ich habe den folgenden Code:

class Parent
{

    static string MyField = "ParentField";

    public virtual string DoSomething()
    {
        return MyField;
    }
}

class Child : Parent
{
    static new string MyField = "ChildField";
}

Jetzt möchte ich beides tun können:

Console.WriteLine(Parent.MyField);
Console.WriteLine(Child.MyField);

Diese funktionieren wie erwartet, aber ich möchte auch dies tun:

Child c = new Child();
Console.WriteLine(c.DoSomething());

Da DoSomething() für die Child-Klasse nicht definiert ist, wird das MyField der Parent-Klasse zurückgegeben, aber was ich will, ist das MyField der Child-Klasse.

Meine Frage lautet also: Gibt es eine Möglichkeit, wie ich das machen kann?

HINWEIS: Das Überschreiben der Methode in der Child-Klasse ist eine Option, aber da ich viele Child-Klassen haben werde, die von der Parent-Klasse erben, und die Methode in allen das Gleiche tun soll, würde eine Änderung in dieser Methode eine Menge Ärger mit sich bringen.

0voto

Rune FS Punkte 20934

Es gibt keine Vererbungsmagie für alles Statische, aber Sie könnten Folgendes tun

protected virtual string { get { return "your value"; } }

und verwenden Sie die Eigenschaft innerhalb Ihrer Methode

0voto

Jeffrey L Whitledge Punkte 55524

In einer Antwort scheinen Sie zu behaupten, dass das statische Feld konstant ist. Wenn das der Fall ist, dann sollte dies für Sie funktionieren.

class Parent
{
    protected virtual string MyField() { return "ParentField"; }

    public virtual string DoSomething()
    {
        return MyField();
    }
}

class Child : Parent
{
    protected override string MyField() { return "ChildField"; }
}

0voto

Vivek Punkte 16076

Die einzige Möglichkeit ist das Überschreiben DoSomething Methode, sonst ist es nicht möglich. Die Website DoSomething sur Parent Methode bedeutet im Wesentlichen Folgendes:

public virtual string DoSomething()
    {
        return Parent.MyField;
    }

Wenn Sie " new " eine Eigenschaft, gilt sie nur für diesen Typ - in diesem Fall Child Klasse. Wenn der Zugriff auf die Eigenschaft über die "Parent"-Klasse erfolgt, wird immer die ursprüngliche Eigenschaft zurückgegeben.

0voto

Thomas Punkte 62314

Lassen Sie mich zunächst sagen, dass Sie MyField wirklich nur virtuell machen sollten und akzeptieren, dass Sie eine Instanz erzeugen müssen, um es zu erhalten. Eine andere Möglichkeit, das Problem zu "lösen", wäre jedoch:

class Parent
{
    public static string MyField = "ParentField";
    protected virtual MyLocalField = MyField;

    public virtual string DoSomething()
    {
        return MyLocalField;
    }
}
class Child : Parent
{
    public static new string MyField = "ChildField";
    protected override MyLocalField = MyField;
}

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