9
votes

Affectation au champ de base statique de la classe de base

public class ClassA
{
    public static readonly string processName;
} 

public class ClassB : ClassA
{
    static ClassB()
    {
        processName = "MyProcess.exe";
    }
}
I am getting an error while compiling the above C# code. The error says -- "A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)"But I am assigning it in a static constructor.The need for such a static variable is that, the base class has methods that uses this variable, but the derived classes and the base class must have different values  for this variable. But the value is constant across all instances of the respective class. It must be readonly because, it must not be changed by anywhere.What is the error in the above code? (If there is any) I do not seem to be able to spot one. The error message is not helping. As I am not doing anything wrong according to it.If there is an error, how can I implement this functionality? I know a simple workaround would be to make it an instance variable and assign them different values in the derived classes. But that is unnecessary as the value is constant across all the instances of the respective class.

0 commentaires

3 Réponses :


5
votes

Dans votre exemple, seul un seul champ existe, celui de la classe de base et vous ne pouvez pas avoir de valeurs différentes dans un seul champ. À côté de cela, vous ne pouvez initialiser que les champs READONLY dans la même classe, pas dans les classes dérivées. Une solution de contournement pourrait définir une classe générique comme: xxx

et utiliser noms de processus .value . Évidemment, la valeur sera accessible publiquement de cette façon.

Cependant, vous devriez voir si la définition du champ dans chaque classe dérivée correspond à votre besoin séparément et seulement recours à la solution de contournement si cela ne le fait pas. < / p>


0 commentaires

15
votes

Vous attribuez dans le constructeur mauvais statique. Il ne peut être attribué que dans un constructeur statique pour le type déclarant la variable .

Supposons que vous ayez une autre classe dérivant de Classc qui fait la même chose - vous finiriez par écraser la variable, qui est destiné à être réadonnant. Il y a une variable statique ici, toutefois de nombreuses classes dérivées que vous avez.

Une réponse est d'éviter d'utiliser une variable statique mais mettre un virtuel propriété dans la classe de base et que chaque classe dérivée remplace la propriété pour renvoyer une constante différente: xxx

option sera essentiellement pour séparer " "Les bits statiques dans une hiérarchie distincte - il semble que vous voulez que vous voulez du polymorphisme sur le type au lieu d'instances, et qui n'est pas pris en charge dans .NET.


1 commentaires

Exactement! "Polymorphisme sur le type". Je ne pense pas que cela pourrait être plus correctement formulé. Merci d'avoir souligné qu'il n'est pas pris en charge dans .NET.



1
votes

Il y a beaucoup de façons de peaufiner le chat. Voici une autre façon de le faire.

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")
    {
    }
}


1 commentaires

mais cela ne fonctionne que dans les variables d'instance, ce qui n'atteint pas vraiment ce qui était recherché