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.

7voto

Bryan Watts Punkte 43539

Wenn Sie ein Konstrukt benötigen, das von der Sprache nicht unterstützt wird, in diesem Fall static virtual Mitglieder, das ist ein Geruch, der auf eine fehlerhafte Konstruktion hinweisen könnte.

Anstatt uns eine Lösung zu zeigen, zeigen Sie uns das Problem, das Sie mit dieser Lösung zu lösen versuchen. Ich vermute, dass es ein völlig anderes Design gibt, das diese Kuriosität überflüssig macht.

Anders ausgedrückt: Die Antworten, die Sie erhalten haben, sind nicht die, die Sie sich wünschen, weil die Frage, die Sie gestellt haben, nicht wirklich die Frage ist, die Sie stellen sollten. Ich kann mir keine Situation vorstellen, in der der vorgeschlagene Entwurf Vorteile bietet, die ein anderer, konventionellerer Entwurf nicht bietet.

1voto

Reed Copsey Punkte 536986

Das müssen Sie auch in Child erledigen:

class Child
{
    static new string MyField = "ChildField";

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

Abgesehen davon wäre die Verwendung einer einzelnen virtuellen Eigenschaft wahrscheinlich ein saubereres Design, da Sie das Schlüsselwort "new" nicht benötigen würden, um das Memberfeld von Parent auszublenden.

1voto

Chuck Wilbur Punkte 2420

Ich verstehe nicht, warum Sie glauben, dass Sie sowohl "statische" als auch "nicht-statische" Umgebungen benötigen, um verschiedene Eigenschaften/Funktionen aufzurufen, die das Gleiche zurückgeben. Wenn Sie nur dies tun:

class Parent
{
    public virtual string DoSomething()
    {
        return "ParentField";
    }
}

class Child
{
    public override string DoSomething()
    {
         return "ChildField";
    }
}

Dann wird das so funktionieren, wie Sie es wollen:

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

Und anstatt das zu schreiben:

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

schreiben Sie dies einfach:

Console.WriteLine(new Parent().DoSomething());
Console.WriteLine(new Child().DoSomething());

Gibt es eine andere Einschränkung des Problems, die dies inakzeptabel macht? Ist zum Beispiel die Erstellung neuer Objekte dieser Klassen aus irgendeinem Grund extrem teuer?

0voto

Jesse Weigert Punkte 4508

Verwenden Sie eine statische Eigenschaft anstelle einer statischen Variablen. Dann können Sie die Eigenschaft in der untergeordneten Klasse außer Kraft setzen, anstatt ein "neues" Feld zu erstellen.

0voto

BFree Punkte 100035

Ja, DoSomething außer Kraft setzen:

class Child
{
    static new string MyField = "ChildField";

    public virtual string DoSomething()
    {
        return 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