2012-03-22 11 views
5

La mia domanda non è probabilmente ben formulata ed è probabilmente una vittima, ma qui vadoC# perché non è possibile sovrascrivere la proprietà statica? (Come possono le classi di alto livello chiamare il metodo della classe base con i dati di alto livello)

class person { 
    protected static string request = "select * from person where gender in ('male','female')"; 
    public string sharedmethod() 
    { 
     return "the request is" + request; 
    } 
} 

class man:person 
{ 
    override protected static string request = "select person.*,man.* from person,men where mytype in ('male') "; 
    DateTime dateOfFirstCar; 
} 

class woman:person 
{ 
    override protected static string request = "select person.*,woman.* from person,women where mytype in ('female') "; 
    DateTime dateOfFirstITBAG; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     if (new person().sharedmethod() == new man().sharedmethod()) 
      Console.Write("too bad query is the same in base and dervide class"); 
    } 
} 

Un uomo è una persona
Una donna è una persona
persona, uomo, donna esiste nel mio database, ma hanno bisogno di query diverse

non voglio duplicare quelle domande così ho pensato che fosse una buona idea per memorizzarli in una proprietà statica in ogni classe.

ho avuto alcune cose di basso livello (non capito lì) che si trovano nella classe di base (coz io non voglio duplicare) e volevo ereditato classi di chiamare il metodo della classe base con il contesto delle classi ereditata

voglio uomo. [ereditato] someMethod() per eseguire person.somemethod(), ma con le variabili provenienti da uomo

ringraziamento

risposta

3

aggiungere un alloggio non statico che copre la stringa statica, e il riferimento che la proprietà invece:

class person { 
    private const string request = "select * from person where gender in ('male','female')"; 
    protected virtual string Request {get {return request;}} 
    public string sharedmethod() { 
     return "the request is" + Request; 
    } 
} 

class man:person { 
    private const string request = "select person.*,man.* from person,men where mytype in ('male') "; 
    protected override string Request {get {return request;}} 
    DateTime dateOfFirstCar; 
} 

class woman:person { 
    private const string request = "select person.*,woman.* from person,women where mytype in ('female') "; 
    protected override string Request {get {return request;}} 
    DateTime dateOfFirstITBAG; 
} 
+0

grazie ma per quanto riguarda la query per persona? – frenchone

+1

@frenchone Ho perso quella parte. Devi rendere la proprietà 'virtual' invece di' abstract', aggiungere un'implementazione nella classe 'person' e aggiungere un' override' alle implementazioni derivate. – dasblinkenlight

+0

Ok, ci provo io – frenchone

3

Perché non puoi? Perché i progettisti di .net hanno deciso che erano più problemi di quanti ne valesse la pena aggiungere questa struttura al framework.

Come per trattare con il vostro disegno, ci sono un sacco di modi per rendere meglio ...

Uno sarebbe quello di avere una classe di supporto statica, mettere lo SQL in quanto stringhe come statiche e aggiungere un metodo statico per restituirlo, quindi chiamarlo da Person, Man Woman, ecc. inserisci un enum in Person e un GetSql statico nella classe helper ed è un lavoro fatto.

Oh e riordina il tasso di accettazione, altrimenti le persone non ti aiuteranno.

+0

> Per quanto riguarda il design, ci sono molti modi per renderlo migliore ... Quindi la mia domanda è "come renderlo migliore"? > una classe di helper statico ho pensato che la classe infernale fosse malvagia? – frenchone

+2

Nessuna classe è cattiva, comunque puoi usarli per il male. Un modello statico di fabbrica è malvagio? .Net è pieno zeppo di classi di helper statiche. Così è il DCL VCL e si può sovrapporre i metodi statici in questo. Se è leggibile e adatto allo scopo, allora va bene. Alcune cose non c'è altro modo ragionevole di fare in un framework OO. –

Problemi correlati