Originariamente inviata da
andbin
Sì appunto ma nota bene, dove è che passi a Camicia il codiceColore? Al setColore E al costruttore. In entrambi i punti devi applicare un controllo.
Allora... Il costruttore di Camicia l'ho sistemato così...
codice:
public Camicia(int elementoID, String descrizione, char codiceColore, double prezzo, char stile) {
super(elementoID, descrizione, codiceColore, prezzo);
switch(codiceColore) {
case 'B':
case 'G':
case 'R':
case 'U':
super.setColore(codiceColore);
break;
default:
super.setColore('X');
}
this.stile = stile;
}
E ho tolto l'override di setColore()...
Funziona.
Riepilogando, siccome devo controllare un argomento nella classe specifica, effettuo il controllo nel costruttore ed eventualmente imposto il valore corretto (o un "segnale X se sbagliato, per il momento...) tramite super.setColore() perché è l'unica via d'accesso al private char codiceColore.
Perché non avevo ragionato così e cercato la via dell'override di setColore? Nei costruttori il riferimento super va usato necessariamente come prima istruzione, quindi credevo che, dopo aver passato codiceColore ad Abbigliamento, lo switch dopo fosse "tardivo".
Quindi devo prima passare il codiceColore che ho, giusto o sbagliato che sia, e poi lo convalido sovrascrivendolo. Quindi setColore() della superclasse viene invocato due volte.
Se questo è il ragionamento corretto, cioè passare due volte per setColore() della superclasse (cosa che sinceramente vedo forzata), allora posso fare tutti i controlli degli argomenti nel costruttore e non fare alcun override. Cioè sfrutto l'incapsulamento e non tanto l'ereditarietà...