Domanda

public class ClassA
{
    public static readonly string processName;
} 

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

Ricevo un errore durante la compilazione del codice C # sopra.

L'errore dice - " Non è possibile assegnare un campo di sola lettura statico (tranne in un costruttore statico o un inizializzatore variabile) "

Ma lo sto assegnando in un costruttore statico.

La necessità di una tale variabile statica è che la classe base abbia metodi che usano questa variabile, ma le classi derivate e la classe base devono avere valori diversi per questa variabile. Ma il valore è costante in tutte le istanze della rispettiva classe. Deve essere di sola lettura perché non deve essere modificato da nessuna parte.

Qual è l'errore nel codice sopra? (Se ce ne sono) Non riesco a individuarne uno. Il messaggio di errore non aiuta. Dato che non sto facendo nulla di male in base ad esso.

Se si verifica un errore, come posso implementare questa funzionalità? So che una semplice soluzione sarebbe quella di renderlo una variabile di istanza e assegnare loro valori diversi nelle classi derivate. Ma ciò non è necessario in quanto il valore è costante in tutte le istanze della rispettiva classe.

È stato utile?

Soluzione

Stai assegnando nel costruttore sbagliato statico. Può essere assegnato solo in un costruttore statico per il tipo che dichiara la variabile .

Supponi di avere un'altra classe derivata da ClassC che fa la stessa cosa - finiresti per sovrascrivere la variabile, che dovrebbe essere di sola lettura. C'è una singola variabile statica qui, comunque molte classi derivate che hai.

Una risposta è evitare di usare una variabile statica ma inserire una proprietà virtuale nella classe base e fare in modo che ciascuna classe derivata sovrascriva la proprietà per restituire una costante diversa:

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

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

Fondamentalmente l'opzione sarebbe quella di separare " statico " bit in una gerarchia separata - in effetti sembra che tu voglia il polimorfismo sul tipo anziché sulle istanze, e che non è supportato in .NET.

Altri suggerimenti

Nel tuo esempio, esiste un solo campo, quello della classe base e non puoi avere valori diversi in un singolo campo. Inoltre, puoi inizializzare solo readonly campi nella stessa classe, non in classi derivate. Una soluzione alternativa potrebbe essere la definizione di una classe generica come:

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

e usa invece ProcessNames<DerivedClassType>.Value. Ovviamente, il valore sarà accessibile al pubblico in questo modo.

Tuttavia, dovresti vedere se la definizione del campo in ogni classe derivata si adatta separatamente alle tue necessità e ricorrere a soluzioni alternative solo se non lo fa.

Esistono molti modi per scuoiare il gatto. Ecco un altro modo per farlo.

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")
    {
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top