Ereditarietà e costruttori

di il
3 risposte

Ereditarietà e costruttori

Buongiorno a tutti, sto provando a cambiare costruttore tra classe padre e classe figlie:

public abstract class FiguraATreLati implements FiguraGeometrica{

private float lato1, lato2, lato3;

public FiguraATreLati(float lato1, float lato2, float lato3){
this.lato1 = lato1;
this.lato2 = lato2;
this.lato3 = lato3;
}
}

public abstract class Triangolo extends FiguraATreLati{

private float altezza;

public Triangolo(float lato1, float lato2, float lato3, float altezza){
super(lato1,lato2,lato3);
this.altezza = altezza;
}
}

Fino a qui tutto bene poiché aggiungo solo nuovi attributi, però poi ho dei problemi quando il costruttore cambia:

public class TriangoloRettangolo extends Triangolo{

public TriangoloRettangolo(float lato1, float lato2, float altezza){
super(lato1,lato2,altezza);
}
}

In questo caso il lato3 dovrei semplicemente calcolarlo con un metodo che esegue la formula di Pitagora.
In fase di compilazione di TriangoloRettangolo mi viene restituito "error constructor Triangolo in class Triangolo cannot be applied to given types".
Ho risolto il problema passando nel costruttore i metodi set per ogni lato e non dichiarando i costruttori nelle classi astratte, però mi chiedevo se fosse possibile ovviare al problema intervenendo solo sul costruttore di TriangoloRettangolo, in modo da avere una scrittura più pulita.

3 Risposte

  • Re: Ereditarietà e costruttori

    manusubito1 ha scritto:


    però mi chiedevo se fosse possibile ovviare al problema intervenendo solo sul costruttore di TriangoloRettangolo, in modo da avere una scrittura più pulita.
    FiguraATreLati è sensato, ed anche il fatto che è abstract è sensato (sia perché esprime un concetto abbastanza generico, sia perché non avrebbe senso fare es. new FiguraATreLati(10, 20, 50) ).
    Però attenzione, già FiguraATreLati potrebbe essere denominato Triangolo

    Triangolo no, non è molto sensato perché ha un costruttore:
    public Triangolo(float lato1, float lato2, float lato3, float altezza) {

    Se non so che tipo di triangolo è ... ha senso trattare una "altezza"? Oltretutto in più oltre ai 3 lati?

    Sarebbe stato invece più sensato:
    public abstract class Triangolo implements FiguraGeometrica {
        private float lato1, lato2, lato3;
    
        public Triangolo(float lato1, float lato2, float lato3) {
    .......
    public class TriangoloRettangolo extends Triangolo {
        public TriangoloRettangolo(float cateto1, float cateto2) {
            super(cateto1, cateto2,  <qui calcolo ipotenusa> );
        }
  • Re: Ereditarietà e costruttori

    Sono d'accordo con te sulla questione dell'altezza, ma la traccia specifica così

    Dunque intendevi una cosa del genere?

    public class TriangoloRettangolo extends Triangolo{

    public TriangoloRettangolo(float lato1, float lato2, float altezza){
    super(lato1, lato2, (float) Math.sqrt( Math.pow(lato1,2) + Math.pow(lato2,2) ) , altezza);
    }
    }
  • Re: Ereditarietà e costruttori

    manusubito1 ha scritto:


    public class TriangoloRettangolo extends Triangolo{

    public TriangoloRettangolo(float lato1, float lato2, float altezza){
    super(lato1, lato2, (float) Math.sqrt( Math.pow(lato1,2) + Math.pow(lato2,2) ) , altezza);
    }
    }
    Dipende cosa intendi per "altezza". Nel triangolo rettangolo, l'altezza è la linea che parte dall'angolo dei due cateti e arriva ortogonale alla ipotenusa. Se intendi questa, ok.
    Comunque, tecnicamente sì è corretto, è coerente con il super-costruttore (quello di Triangolo).
Devi accedere o registrarti per scrivere nel forum
3 risposte