2009-04-07 20 views
9

Se ho una classe base e due classi derivate e voglio implementare il cast tra le due classi derivate a mano, c'è un modo per farlo? (In C#)Override (cast)

abstract class AbsBase 
{ 
    private int A; 
    private int B; 
    private int C; 
    private int D; 
} 

class Imp_A : AbsBase 
{ 
    private List<int> E; 
} 


class Imp_B : AbsBase 
{ 
    private int lastE; 
} 

genere io sarò Pezzi fusi di Imp_A -> Imp_B e voglio l'ultimo valore nell'elenco E di essere il 'Laste'. Inoltre, se ci fossero tre o più classi di implementazione (come Salario, Ogni ora, Consulente e Ex dipendenti).

Indipendentemente dal fatto che sia architettonicamente corretto (non posso descrivere l'intera applicazione ed essere conciso) È possibile?

Stavo per scrivere un convertitore, ma a mio avviso un convertitore creerà un nuovo oggetto della classe Imp_B, di cui non ho bisogno perché il "dipendente" sarà solo una delle opzioni in qualsiasi tempo.

-Devin

risposta

19

È necessario implementare un operatore explicit o implicit.

class Imp_A : AbsBase 
{ 
    public static explicit operator Imp_B(Imp_A a) 
    { 
     Imp_B b = new Imp_B(); 

     // Do things with b 

     return b; 
    } 
} 

Ora è possibile effettuare le seguenti operazioni.

Imp_A a = new Imp_A(); 
Imp_B b = (Imp_B) a; 
+1

Ricorda che questo (ovviamente) creerà effettivamente un nuovo oggetto Imp_B. – mquander

+0

Questo è perfetto. Ma, come dice manderand, è un nuovo oggetto, che credo sia inevitabile. Ma questo significa che "a" non sarà GC fino a quando non rientra nello scope, anche se non lo uso mai più (come Imp_A)? – DevinB

+0

Sì, verrà raccolto solo se non rientra nell'ambito e non si detengono più riferimenti ad esso. –

2

Io suggerirei di scrivere Imp_B come questo, se possibile:

class Imp_B : Imp_A 
{ 
    private int A; 
    private int B; 
    private int C; 
    private int D; 
    private int lastE { get { return this.E.Last(); } } 
} 

Se non si può effettivamente derivare da ImpB, è impossibile per voi a "trattare" un ImpA oggetti come un ImpB in modo trasparente come vorresti, perché non sono la stessa cosa in memoria. Quindi, implementa una conversione esplicita.

+0

dispiace, hai ragione, io rimuovo A-D – DevinB

+0

Inoltre, queste classi saranno molto più complicato, con alcune variabili che sono esclusivi per ciascuna. E poi certe variabili (come E) che sono direttamente correlate, ma non necessariamente le stesse. – DevinB