reynold ha scritto:
Poi ho definito la classe quadrato che è sottoclasse di rettangolo.
Già questo è sbagliato concettualmente. Perché un quadrato impone un vincolo, cioè una restrizione in più, rispetto ad un rettangolo: che i due lati siano uguali. E questo con l'ereditarietà è critico.
Può aver senso e funzionare bene solo se Rettangolo e Quadrato fossero "immutabili".
public class Rettangolo {
private final int lato1;
private final int lato2;
public Rettangolo(int lato1, int lato2) {
this.lato1 = lato1;
this.lato2 = lato2;
}
public int getLato1() {
return lato1;
}
public int getLato2() {
return lato2;
}
}
public class Quadrato extends Rettangolo {
public Quadrato(int lato) {
super(lato, lato);
}
public int getLato() {
return getLato1();
}
}
Ma se volessi farli "mutabili", diventa un gran casino.
reynold ha scritto:
Posso dichiarare la classe cubo sottoclasse di quadrato o violo l'ereditarietà?
Questo sarebbe ancora peggio!! Perché se in Quadrato hai gli attributi
larghezza e
altezza e in Cubo (che estende Quadrato) aggiungi solo
profondita, vai a violare il principio di sostituibilità.
Dove è richiesto un Quadrato, diverrebbe lecito passare un oggetto Cubo ... ma non ha senso!
Evita questi accrocchi.