Ereditarietà

di il
3 risposte

Ereditarietà

Ho definito la classe Rettangolo. Poi ho definito la classe quadrato che è sottoclasse di rettangolo. La classe quadrato ha un costruttore Quadrato che richiama con super il costruttore della classe rettangolo.
Posso dichiarare la classe cubo sottoclasse di quadrato o violo l'ereditarietà?
Quadrato cosi sarebbe sottoclasse di rettangolo ma superclasse di cubo

3 Risposte

  • Re: Ereditarietà

    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.
  • Re: Ereditarietà

    Può aver senso e funzionare bene solo se Rettangolo e Quadrato fossero "immutabili"
    Le classi le ho scritte come hai fatto tu.
    Quindi con immutabili intendi con le variabili di istanza private e non protected o public?
  • Re: Ereditarietà

    reynold ha scritto:


    Le classi le ho scritte come hai fatto tu.
    Allora ok!

    reynold ha scritto:


    Quindi con immutabili intendi con le variabili di istanza private e non protected o public?
    Una classe definisce oggetti "immutabili" quando lo stato dell'oggetto non può più cambiare dopo che l'oggetto è stato istanziato.

    Quindi:
    - campi non accessibili dall'esterno o da sotto-classi (pertanto il private è assolutamente utile/appropriato)
    - campi possibilmente final (questo non è strettamente necessario ma ha benefici in ambito multi-threading che ora non sto ad approfondire)
    - nessun metodo "setter" o altro metodo che possa cambiare lo "stato" dell'oggetto (se i campi non sono final).
Devi accedere o registrarti per scrivere nel forum
3 risposte