2010-03-09 13 views
33

Il mio codice qui sotto non verrà compilato. Che cosa sto facendo di sbagliato? In pratica sto provando ad avere una costante pubblica che è sovrascritta nella classe base.Come avere costanti astratte e sovrascritte in C#?

public abstract class MyBaseClass 
{ 
    public abstract const string bank = "???"; 
} 

public class SomeBankClass : MyBaseClass 
{ 
    public override const string bank = "Some Bank"; 
} 

Grazie come sempre per essere stato così utile!

+0

Oppure ho aperto una lattina di worm, perché le cost sono statiche, quindi il polimorfismo in realtà non si applica a loro? – Chris

+0

Forse dovresti spiegare cosa stai cercando di ottenere con il codice sopra? Perché il nome della banca non può essere una proprietà di istanza. Sembra naturale dato che è nella classe e la classe ha lo stesso nome? –

+0

controlla questo post precedente Non puoi ignorare un const http://stackoverflow.com/questions/770437/overriding-constants-in-derived-classes-in-c/770443#770443 –

risposta

41

Se la tua costante sta descrivendo il tuo oggetto, allora dovrebbe essere una proprietà. Una costante, con il suo nome, non dovrebbe cambiare ed è stata progettata per non essere influenzata dal polimorfismo. Lo stesso vale per la variabile statica.

È possibile creare una proprietà astratta (o virtuale, se si desidera un valore di default) nella classe di base:

public abstract string Bank { get; } 

poi sovrascrivere con:

public override string Bank { get { return "Some bank"; } } 
+0

Ho dovuto aggiungere la parola chiave" nuova "al codice di override per non avere un avviso. – Sunkas

+2

La parola chiave" nuova "è necessaria quando stai sovrascrivendo una funzione genitore che non è stata dichiarata come "virtuale" o "astratta" –

+0

Man !, una buona risposta –

13

Quello che stai cercando di fare non può essere fatto. static e const non possono essere sovrascritti. Solo le proprietà e i metodi dell'istanza possono essere sovrascritti.

È possibile attivare che bank campo in a una proprietà e di mercato come astratto come la seguente:

public abstract string Bank { get; } 

Poi si sarà sovrascrivere il metodo nella classe ereditata come voi avete fatto

public override string Bank { get { return "Charter One"; } } 

Spero che questo ti aiuti. Il rovescio della medaglia si può anche fare

public const string Bank = "???"; 

e poi sulla classe ereditata

public const string Bank = "Charter One"; 

Dal static e const operare al di fuori del polimorfismo che non hanno bisogno di essere sovrascritto.

+0

Perché non si può fare? Sembra una decisione di progettazione, e la maggior parte delle decisioni di progettazione in C# hanno motivi validi e interessanti dietro di loro IMO quindi sono curioso. – Chris

+2

il compilatore sostituisce con valori letterali al momento della compilazione –

+0

'static' e' const' sono meglio considerati come definizioni globali, il che significa che non rispettano il polimorfismo. E può essere chiamato senza creare un'istanza della classe. Dato che ho aggiornato il mio post.Puoi fare ciò che vuoi, ma non puoi usare il polimorfismo per realizzarlo. –

3

Nel caso in cui si desidera continuare a utilizzare "const", una leggera modificaiton a quanto sopra:

public abstract string Bank { get; } 

poi sovrascrivere con:

private const string bank = "Some Bank"; 
public override string Bank { get { return bank;} } 

E la proprietà restituirà quindi il tuo "const" dal tipo derivato.

+0

Sfortunatamente non ritorna come const, se provo ad accedere a 'SomeBankClass.Bank' I get" An il riferimento a un oggetto è richiesto per il campo, il metodo o la proprietà "SomeBankClass.Bank" non statici, che ha senso. Quando 'Bank' era una stringa const const in' SomeBankClass', questo accesso andava bene. – Gobe