Zuordnung zum statischen schreibgeschützten Feld der Basisklasse

8
%Vor%

Ich erhalte einen Fehler beim Kompilieren des obigen C # -Codes.

Der Fehler sagt - "Ein statisches schreibgeschütztes Feld kann nicht zugewiesen werden (außer in einem statischen Konstruktor oder einem Variableninitialisierer)"

Aber ich weise es in einem statischen Konstruktor zu.

Die Notwendigkeit für eine solche statische Variable besteht darin, dass die Basisklasse über Methoden verfügt, die diese Variable verwenden, die abgeleiteten Klassen und die Basisklasse jedoch unterschiedliche Werte für diese Variable haben müssen. Der Wert ist jedoch für alle Instanzen der jeweiligen Klasse konstant. Es muss nur gelesen werden, weil es nicht von irgendwo geändert werden darf.

Was ist der Fehler im obigen Code? (Wenn es welche gibt), scheint es mir nicht möglich zu sein. Die Fehlermeldung hilft nicht. Da ich damit nichts falsch mache.

Wenn ich einen Fehler habe, wie kann ich diese Funktionalität implementieren? Ich weiß, ein einfacher Workaround wäre, es zu einer Instanzvariable zu machen und ihnen unterschiedliche Werte in den abgeleiteten Klassen zuzuweisen. Aber das ist unnötig, da der Wert für alle Instanzen der jeweiligen Klasse konstant ist.

    
Poulo 14.09.2009, 10:52
quelle

3 Antworten

15

Sie ordnen den statischen Konstruktor jedoch falsch zu. Sie kann nur in einem statischen Konstruktor für den Typ zugewiesen werden, der die Variable deklariert.

Angenommen, Sie haben eine andere Klasse, die von ClassC abgeleitet ist und dasselbe tut - Sie würden die Variable überschreiben, die nur gelesen werden soll. Es gibt hier eine einzelne statische Variable, jedoch viele abgeleitete Klassen, die Sie haben.

Eine Antwort besteht darin, eine statische -Variable zu vermeiden, aber eine virtuelle -Eigenschaft in die Basisklasse einzufügen und jede abgeleitete Klasse die Eigenschaft so zu überschreiben, dass sie eine andere Konstante zurückgibt:

%Vor%

Grundsätzlich wäre es eine Option, die "statischen" Bits in eine separate Hierarchie zu trennen - effektiv klingt es nach Polymorphie über dem Typ anstelle von Instanzen, und das wird in .NET nicht unterstützt.

    
Jon Skeet 14.09.2009, 10:56
quelle
5

In Ihrem Beispiel existiert nur ein einzelnes Feld, das der Basisklasse, und Sie können in einem einzelnen Feld keine unterschiedlichen Werte haben. Außerdem können Sie readonly -Felder nur in derselben Klasse und nicht in abgeleiteten Klassen initialisieren. Ein Workaround könnte eine generische Klasse definieren wie:

%Vor%

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

Sie sollten jedoch sehen, ob das Definieren des Felds in jeder abgeleiteten Klasse Ihrem Bedarf entspricht und nur zu Problemumgehungen führt, wenn dies nicht der Fall ist.

    
Mehrdad Afshari 14.09.2009 10:56
quelle
1

Es gibt viele Möglichkeiten, die Katze zu häuten. Hier ist eine andere Möglichkeit, wie Sie es tun können.

%Vor%     
Vadim 14.09.2009 11:04
quelle