2012-11-29 14 views
5

Dopo alcune ricerche non ho trovato nessuna risposta valida alla mia domanda riguardante il costruttore di copie e l'ereditarietà. Ho due classi: utente e tirocinante. Il tirocinante eredita dall'utente e due parametri di stringa vengono aggiunti al tirocinante. Ora sono riuscito a creare un costruttore di copia di User ma non sono soddisfatto del mio costruttore di copia di Trainee. Il codice del costruttore di copia utente è come questo:java copy constructor ed ereditarietà

public User (User clone) { 
    this(clone.getId(), 
     clone.getCivilite(), 
     clone.getNom(), 
     clone.getPrenom(), 
     clone.getEmail(), 
     clone.getLogin(), 
     clone.getTel(), 
     clone.getPortable(), 
     clone.getInscription(), 
     clone.getPw() 
    ); 
} 

Ho cercato di usare eccellente nel mio Apprendista costruttore di copia:

public Trainee (Trainee clone) { 
    super (clone); 
    this (clone.getOsia(), clone.getDateNaiss()); 
} 

Ma non ha funzionato e sono stato costretto a codificare un versione completa del costruttore di copia:

public Trainee (Trainee clone) { 
    this(clone.getId(), 
     clone.getCivilite(), 
     clone.getNom(), 
     clone.getPrenom(), 
     clone.getEmail(), 
     clone.getLogin(), 
     clone.getTel(), 
     clone.getPortable(), 
     clone.getInscription(), 
     clone.getPw(), 
     clone.getOsia(), 
     clone.getDateNaiss() 
    ); 
} 

a causa della costruzione del mio principale devo lanciare la mia nuova istanza in questo modo:

User train = new Trainee(); 
    User train2 = new Trainee((Trainee) train); 

Quindi la mia domanda è: c'è un modo più pulito per fare questo? Non posso usare un super?

Grazie in anticipo per le vostre risposte e assistenza.

+2

cosa non ha funzionato quando hai usato 'super (clone)' – Xymostech

risposta

8

Sarebbe meglio per rendere il costruttore "full" copia per Trainee anche prendere un User:

public Trainee(Trainee clone) 
{ 
    this(clone, clone.getOsai(), clone.getDateNaiss()); 
} 

public Trainee(User clone, String osai, String dateNaiss) 
{ 
    super(clone); 
    this.osai = osai; 
    this.dateNaiss; 
} 

Per quanto possibile, vale la pena tenere al modello di avere un costruttore di "master" in ogni classe, a cui tutti gli altri costruttori collegano, direttamente o indirettamente.

Ora, non è chiaro se abbia senso creare un Traineesenza specificando le informazioni utente esistenti ... o eventualmente specificandolo in qualche altro modo. È può essere che in questo caso è davvero do necessario disporre di due set separati di costruttori - un set per i costruttori di copia e un set per i costruttori "just give me the values ​​singles". Dipende davvero dal tuo contesto - non possiamo dire solo da questo.

In tal caso, si interromperà leggermente la regola "un costruttore principale", ma si può pensare che ci siano due costruttori master, uno per ciascun set di costruttori per scopi diversi. Fondamentalmente, si sta eseguendo in "eredità diventa disordinato" - che è fin troppo comune :(

0

vorrei fare:

public Trainee (User clone) // By specifying `User` you allow the use in your code 
{ 
    super (clone); 
    if (clone instanceof Trainee) { 
     this.osia = clone.getOsia(); 
     this.dateNaiss = clone.getDateNaiss()); 
    } 
} 
+0

? Eviterei l'operatore 'instanceof', che ti lega a un tipo specifico. –