2009-07-10 5 views
5

OK, quindi ammetto proprio dall'alto che questo è un po 'impreciso ... ma serve a uno scopo logico. Sto usando C# per un progetto corrente e sto cercando di trovare un modo per sovrascrivere una variabile membro in una classe derivata, ma accedere alla variabile sostituita in un metodo di classe base. Per rendere le cose più "divertenti" sarebbe preferibile se la variabile membro sottoposto a override fosse statica (questo NON è mostrato nel codice di esempio seguente).C# Sostituzioni variabili del membro utilizzate dal metodo della classe base

Ecco il mio codice di esempio:

class baseclass 
{ 
    protected string[] array = null; 

    public string method() 
    { 
     string str = ""; 
     foreach (string x in this.array) 
     { 
      str += x + " "; 
     } 

     return str; 
    } 
} 

class subclass1 : baseclass 
{ 
    new string[] array = new string[] 
    { 
     "class1value1", 
     "class1value2", 
     "class1value3", 
     "class1value4" 
    }; 
} 

class subclass2 : baseclass 
{ 
    new string[] array = new string[] 
    { 
     "class2value1", 
     "class2value2", 
     "class2value3", 
     "class2value4" 
    }; 
} 

Qualsiasi pensiero sul perché questo non funziona e un modo per aggirare l'ostacolo?

+1

variabili membri non sono polimorfici come metodi. Inizializza la matrice per contenere i valori desiderati in ciascuna sottoclasse. –

risposta

8

C'è qualche ragione per cui non è possibile utilizzare una proprietà virtuale? Ciò fornirebbe esattamente la funzionalità che stai cercando. Non sarebbe solo un campo.

protected abstract string[] array { get; } 

...

protected override string[] array { get { return new string[]{"...","..."}; }} 
+0

Sto giocando con questo adesso ... hai ragione potrebbe funzionare ... stai ancora giocando per essere sicuro. Grazie per aver aggiunto più fiducia nei miei pensieri. –

1

Perché è necessario sostituire la variabile? Guardando dal tuo codice, sarebbe sufficiente impostare i valori, no?

Inoltre, le variabili statiche sono legate alla classe (non all'istanza), pertanto non è sovrascrivibile in nessuna situazione.

+0

stai creando una classe separata solo per contenere dati diversi, +1 –

1

Semplicemente non utilizzare nuovo. Imposta la matrice nel costruttore della sottoclasse.

EDIT: con il codice:

class subclass1 : baseclass 
{ 
    public subclass1() 
    { 
     array = new string[] 
     { 
      "class1value1", 
      "class1value2", 
      "class1value3", 
      "class1value4" 
     }; 
    } 
} 

class subclass2 : baseclass 
{ 
    public subclass2() 
    { 
     array = new string[] 
     { 
      "class2value1", 
      "class2value2", 
      "class2value3", 
      "class2value4" 
     }; 
    } 
} 
+0

questo non mi permetterebbe di avere una matrice statica –

1
class BaseClass 
{ 
    public virtual string Method() 
    { 
     return string.Empty; 
    } 
} 

abstract class BaseClass<T> : BaseClass where T : BaseClass<T> 
{ 
    protected static string[] strings; 

    public override string Method() 
    { 
     return string.Join(" ", strings); 
    } 
} 

class Subclass1 : BaseClass<Subclass1> 
{ 
    static Subclass1() 
    { 
     strings = new[] { "class1value1", "class1value2", "class1value3" }; 
    } 
} 

class Subclass2 : BaseClass<Subclass2> 
{ 
    static Subclass2() 
    { 
     strings = new[] { "class2value1", "class2value2", "class2value3" }; 
    } 
} 

La parte importante è il parametro generico T che fondamentalmente funziona come indice per le matrici di stringhe.

1

Si sta tentando di ottenere un comportamento polimorfico dall'array ma lo si sta definendo per il comportamento locale della classe.

La matrice deve essere virtuale o metodo() nella classe di base viene compilato per accedere sempre la matrice nella classe base - la matrice deve essere anche un non proprietà un campo per fare questo, cioè,

string [] _array = {...};/valori locali della classe base stringa virtuale protetta [] array {get {return _array; }} // rende la proprietà di matrice override

poi nelle sottoclassi, è necessario fare

string [] _array = {...}; // sottoclasse valori locali stringa virtuale [] array {get {return _array; }} // Questo sovrascrive la proprietà classe base

al fine di ottenere i desiderati influenzare

Problemi correlati