Frage

public class ClassA
{
    public static readonly string processName;
} 

public class ClassB : ClassA
{
    static ClassB()
    {
        processName = "MyProcess.exe";
    }
}

Ich erhalte eine Fehlermeldung, während des oben C # -Code zu kompilieren.

Der Fehler sagt - „Ein statisches Nur-Lese-Feld nicht (außer in einem statischen Konstruktor oder eine Variableninitialisierer) zugeordnet werden kann“

Aber ich es in einem statischen Konstruktor bin zuweisen.

Die Notwendigkeit für eine solche statische Variable ist, dass die Basisklasse Methoden, die diese Variable verwendet, aber die abgeleiteten Klassen und die Basisklasse müssen unterschiedliche Werte für diese Variable haben. Aber der Wert ist in allen Instanzen der jeweiligen Klasse konstant. Es muss nur lesbar, weil, es darf nicht von überall geändert werden.

Was ist der Fehler in dem obigen Code? (Wenn es eine gibt) Ich scheine nicht in der Lage sein, einen zu erkennen. Die Fehlermeldung ist nicht zu helfen. Da ich nichts falsch machen nach ihm.

Wenn ein Fehler ist, wie kann ich diese Funktionalität implementieren? Ich weiß, dass eine einfache Abhilfe es eine Instanz variabel zu machen wäre und ihnen unterschiedliche Werte in den abgeleiteten Klassen zuordnen. Aber das ist nicht notwendig, da der Wert über alle Instanzen der jeweiligen Klasse konstant ist.

War es hilfreich?

Lösung

Sie die Zuordnung in dem falsch statischen Konstruktor though. Es kann nur in einem statischen Konstruktor für den Typen zugeordnet werden deklariert die Variable .

Angenommen, Sie eine andere Klasse ZUSAMMENHANG ClassC haben, die die gleiche Sache tut - die Variable würde am Ende zu überschreiben, die nur lesbar sein gemeint ist. Es gibt eine Single statische Variable ist hier jedoch viele abgeleitete Klassen, die Sie haben.

Eine Antwort ist eine statische Aufladung zu vermeiden, mit Variable , sondern setzt eine virtuelle Eigenschaft in der Basisklasse, und macht jede abgeleitete Klasse die Eigenschaft außer Kraft setzen, eine andere Konstante zurückzukehren:

public class ClassA
{
    public virtual string ProcessName { get { return "ClassAProcess"; } }
} 

public class ClassB : ClassA
{
    public override string ProcessName { get { return "MyProcess.exe"; } }
}

Im Grunde Option, um die „statischen“ Bits in eine separate Hierarchie zu trennen wäre -. Wirkungsvoll es klingt wie Sie Polymorphismus über die Art wollen anstelle von Instanzen, und das ist nicht in .NET unterstützt

Andere Tipps

In Ihrem Beispiel nur ein einzelne Feld existieren wird, dass die Basisklasse und Sie können nicht unterschiedliche Werte in einem einzigen Feld haben. Daneben können Sie nur readonly Felder in der gleichen Klasse initialisieren, nicht in abgeleiteten Klassen. Eine Abhilfe könnte eine generische Klasse wie sein definieren:

static class ProcessNames<T> {
   public static string Value { get; set; }
}

und verwenden ProcessNames<DerivedClassType>.Value statt. Offensichtlich wird der Wert auf diese Weise öffentlich zugänglich sein.

Sie sollten jedoch sehen, das Feld in jeder abgeleiteten Klasse, wenn die Definition separat Ihren Bedarf paßt und nur Behelfslösungen zurückgreifen, wenn es nicht.

Es gibt viele Möglichkeiten, um die Katze Haut. Hier ist eine andere Art und Weise Sie es tun können.

public class ClassA
{
    public string ProcessName{ get; private set;}

    public ClassA()
    {
        ProcessName = "ClassAProcess";
    }

    public ClassA(string processName)
    {
        ProcessName = processName;
    }
}

public class ClassB : ClassA
{
    public ClassB() : base("ClassAProcess")
    {
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top