Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Trento
    Messaggi
    13

    Programma OOP, consiglii/aiuto completamento

    Salve a tutti, premetto che sono alle prime armi con la OOP.... Mi è stato assegnato l'esercizio qui sotto, l'ho svolto in gran parte, (non sono sicuro della totale essattezza), comunque sia mi sono bloccato nella creazione della classe "ScaffaleDiPoligoni", sopprattuttto nei metodi "sistemaPoligono" dove all'interno dell'if, nn so come verificare che il poligono "form" appartenga alla classe Triangle,Circle o Rettangle e come verificare succesivamente verificare quale lato sia il piu piccolo, cosi poi da sommarlo alla variabile shelf.

    Potete darmi qualche dritta???
    Inoltre, il codice è scritto con chiarezza e indentato corretamente??
    L'uso dei commenti è buono?

    P.S: Se vedete errori di ragionamento, ecc nel codice vi chiederei cortesemente di farmelo notare

    Grazie mille fin da ora

    codice:
     /*
    Realizza la classe Punto con tutti i metodi che ritieni opportuni più il metodo (statico) creaCasuale()
    che crea un punto casuale e lo restituisce. Successivamente crea la superclasse astratta Poligono che ha i
    metodi getPerimetro () e getArea(). Da questa classe derivano le classi Cerchio, Rettangolo e Triangolo.
    Per ciascuna di queste classi, dopo avere realizzato i metodi che ritieni opportuni, realizza un metodo statico
    creaCasuale() che crea un oggetto con valori a caso e lo restituisce.
    Realizza infine la classe ScaffaleDiPoligoni che è una collezione di (massimo) dieci poligoni sistemati in modo da
    occupare meno spazio possibile (i triangoli e i rettangoli sono poggiati sul lato più corto, le circonferenze
    occupano lo spazio del loro diametro: si trascuri l'eventuale contatto tra i poligoni al di sopra della retta presa in
    considerazione).
    I metodi di questa classe sono: getPorzioneOccupata(), getTotPoligoni(), getPoligono(i), sistemaPoligono(p),
    toString(). Il primo metodo restituisce la misura dello scaffale occupata. Il metodo getTotPoligoni() restituisce
    un intero tra 0 e 10 che rappresenta la quantità di poligoni già sistemati sullo scaffale. Il metodo getPoligono(i)
    restituisce un puntatore al poligono inserito in posizione i-esima. Il metodo sistemaPoligono(p) posiziona nel modo più
    opportuno il poligono sullo scaffale. Il metodo toString() presenta un elenco dei poligono inseriti sullo scaffale; di
    ciascun poligono si presenterà il tipo (Triangolo, Rettangolo, Cerchio), le sue caratteristiche
    (i vertici o il centro con il raggio) ed infine l'ingombro.
    Realizza infine una classe Test che sistema su uno scaffale un numero di poligoni a caso tra 5 e 10.
    I poligoni saranno scelti a caso tra quelli disponibili.
    I punti e l'eventuale misura del raggio saranno anch'essi casuali.
     */
    
    class Point {
        private int x;
        private int y;
        private static int x1;
        private static int y1;
        static int nPoint;
    
    
        //Costruttore
    
        public Point() {
            nPoint++;
        }
    
        public Point(int x, int y) {
            this.x = x;
            this.y = y;
            nPoint++;
        }
    
        //Getter e Setter di x,y e x1,y1
    
        public int getX() {
            return x;
        }
    
        public void setX(int x) {
            this.x = x;
        }
    
        public int getY() {
            return y;
        }
    
        public void setY(int y) {
            this.y = y;
        }
    
        public static int getX1() {
            return x1;
        }
    
        public static int getY1() {
            return y1;
        }
    
        //Metodo creazione punto casuale
    
        public static String creaCasuale() {
            //N casuale da 0.0 a 20
            x1 = (int) (20 * Math.random());
            y1 = (int) (20 * Math.random());
            return getX1() + " " + getY1();
        }
    }
    
    abstract class Poligono {
    
        //Metodi astratti
    
        public abstract double getPerimetro();
        public abstract double getArea();
       // public abstract String getPoligono();
    }
    
    class Rettangle extends Poligono{
        private double AB, BC, CD, DA;
        private static double Ab,Bc;
        private static String rettangle;
    
        //Costruttori
    
        public Rettangle (double AB, double BC){
            this.AB = AB;
            this.BC = BC;
        }
    
        public Rettangle(Point A, Point B, Point C, Point D){
    
            //Formula distanza tra due punti
    
            AB = Math.sqrt(Math.pow((B.getX()-A.getX()),2)+Math.pow((B.getY()-A.getY()),2));
            BC = Math.sqrt(Math.pow((C.getX()-B.getX()),2)+Math.pow((C.getY()-B.getY()),2));
            CD = Math.sqrt(Math.pow((D.getX()-C.getX()),2)+Math.pow((D.getY()-C.getY()),2));
            DA = Math.sqrt(Math.pow((A.getX()-D.getX()),2)+Math.pow((A.getY()-D.getY()),2));
        }
    
        public double getAB() {
            return AB;
        }
    
        public double getBC() {
            return BC;
        }
    
        public double getCD() {
            return CD;
        }
    
        public double getDA() {
            return DA;
        }
    
        public static double getAb() {
            return Ab;
        }
    
        public static double getBc() {
            return Bc;
        }
        //Metodi Perimetro e Area non Static
    
        @Override
        public double getPerimetro() {
            return (AB + BC) * 2;
        }
    
        @Override
        public double getArea() {
            return AB * BC;
        }
    
        //Metodi Static
    
        public static String creaCasuale() {
            //Creo i lati del Rettangolo
    
            Ab = (int)(20 * Math.random()) + 1;
            Bc = (int)(20 * Math.random()) + 1;
    
            //Per maggiore compresione utilizzo una variabile Stringa
    
            rettangle = ("AB=CD=" + Ab + " BC=DA=" + Bc);
            return rettangle;
        }
    
        public static double getPerimeter(){
            return (Ab + Bc) * 2;
        }
    
        public static double getAreA(){
            return Ab * Bc;
        }
    }
    
    class Triangle extends Poligono{
        private double AB, BC, CA;
        private static double Ab, Bc, Ca;
        private static String triangle;
    
        //Costruttore
        public Triangle(double AB, double BC, double CA) {
            this.AB = AB;
            this.BC = BC;
            this.CA = CA;
        }
    
        public Triangle(Point A, Point B, Point C){
    
            //Formula distanza tra due punti
    
            AB = (int)Math.sqrt(Math.pow((B.getX()-A.getX()),2)+Math.pow((B.getY()-A.getY()),2));
            BC = (int)Math.sqrt(Math.pow((C.getX()-B.getX()),2)+Math.pow((C.getY()-B.getY()),2));
            CA = (int)Math.sqrt(Math.pow((A.getX()-C.getX()),2)+Math.pow((A.getY()-C.getY()),2));
        }
    
        //Metodi getter
    
        public double getAB() {
            return AB;
        }
    
        public double getBC() {
            return BC;
        }
    
        public double getCA() {
            return CA;
        }
    
        public static double getAb() {
            return Ab;
        }
    
        public static double getBc() {
            return Bc;
        }
    
        public static double getCa() {
            return Ca;
        }
    
        //Metodi Perimetro e Area non Static
    
        @Override
        public double getPerimetro() {
            return AB +BC +CA;
        }
    
        @Override
        public double getArea() {
            double halfPerimeter = (AB +BC +CA)/2;
            return Math.sqrt( halfPerimeter * (halfPerimeter - AB) * (halfPerimeter - BC) * (halfPerimeter -CA));
        }
    
        //Metodi Static
    
        public static String creaCasuale() {
            //Creo i lati del Triangolo
    
            Ab = (int)(20 * Math.random()) + 1;
            Bc = (int)(20 * Math.random()) + 1;
            Ca = (int)(20 * Math.random()) + 1;
    
            //Per maggiore compresione utilizzo una variabile Stringa
    
            triangle = "AB= " + Ab + " BC= " + Bc + " CA= " + Ca;
            return triangle;
        }
    
        public static double getPerimeter(){
            return Ab + Bc + Ca;
        }
    
        public static double getAreA(){
            double halfPerimeter = (Ab +Bc +Ca)/2;
            return Math.sqrt( halfPerimeter * (halfPerimeter - Ab) * (halfPerimeter - Bc) * (halfPerimeter -Ca));
        }
    }
    
    class Circle extends Poligono{
        private double radius;
        private static final double piGreco = 3.14159;
        private static double radiuss;
    
        //Costruttori
    
        public Circle(double radius) {
            this.radius = radius;
        }
    
        //Metodi getter
    
        public double getRadius() {
            return radius;
        }
    
        public static double getRadiuss() {
            return radiuss;
        }
    
        //Metodo Area e Perimetro non Statici
    
        @Override
        public double getPerimetro() {
            return 2 * radius * piGreco;
        }
    
        @Override
        public double getArea() {
            return Math.pow(radius,2.0) * piGreco;
        }
    
        //Metodi Statici
    
        public static String creaCasuale() {
            //Creo il ragiio
    
            radiuss = (int)(20 * Math.random()) + 1;
    
            return "r = " + radiuss;
        }
    
        public static double getPerimeter(){
            return 2 * radiuss * piGreco;
        }
    
        public static double getAreA(){
            return Math.pow(radiuss,2.0) * piGreco;
        }
    }
    
    class ScaffaleDiPoligoni {
        private double shelf;
        private Poligono [] vetPoligoni = new Poligono [10];
        private int cnt = 0;
    
        //Costruttore
        public ScaffaleDiPoligoni(){}
    
        //Metodi
    
        public void sistemaPoligono(Poligono form){
    
            if(cnt < 10){
                vetPoligoni[cnt] = form;
                cnt++;
            }else {
                System.out.println("Raggiunto limite massimo di Poligoni sullo scaffale")}
        }
    
        public int getTotPoligoni() {
            return cnt;
        }
    
        public int getPorzioneOccupata(){
    
        }
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Potete darmi qualche dritta???
    Inoltre, il codice è scritto con chiarezza e indentato corretamente??
    L'uso dei commenti è buono?
    Classe Point (ti è stato chiesto di creare Punto ... non Point in inglese):
    1) i campi statici x1/y1 NON hanno senso di esistere (e nemmeno getX1/getY1).
    2) costruttori ok. Vedo che tieni traccia di quante sono le istanze. Male non fa ma non mi sembra che sia stato richiesto.
    3) getter/setter ok
    4) creaCasuale no, non ha senso che restituisca String. Deve restituire un oggetto di quella classe! Non una stringa (che serve ben poco)


    Classe Poligono:
    1) getPerimetro()/getArea() astratti ok


    Classi Rettangle e Triangle (idem, è stato chiesto Rettangolo e Triangolo):
    1) mi paiono complesse e "contorte"
    2) creaCasuale idem non deve restituire un String


    Ripensa bene il tutto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Trento
    Messaggi
    13
    1) i campi statici x1/y1 NON hanno senso di esistere (e nemmeno getX1/getY1).
    Togliendoli come posso fare questo?? ma sopprattutto come ritorno l'oggetto??

    codice:
    public static String creaCasuale() {
            //N casuale da 0.0 a 20
            x1 = (int) (20 * Math.random());
            y1 = (int) (20 * Math.random());
            return getX1() + " " + getY1();
        }

    Per il resto ci sto lavoranod!!!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Togliendoli come posso fare questo?? ma sopprattutto come ritorno l'oggetto??
    Generi x/y casuali, invochi il costruttore e .. restituisci l'oggetto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Trento
    Messaggi
    13
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Classe Point (ti è stato chiesto di creare Punto ... non Point in inglese):
    1) i campi statici x1/y1 NON hanno senso di esistere (e nemmeno getX1/getY1).
    2) costruttori ok. Vedo che tieni traccia di quante sono le istanze. Male non fa ma non mi sembra che sia stato richiesto.
    3) getter/setter ok
    4) creaCasuale no, non ha senso che restituisca String. Deve restituire un oggetto di quella classe! Non una stringa (che serve ben poco)


    Classe Poligono:
    1) getPerimetro()/getArea() astratti ok


    Classi Rettangle e Triangle (idem, è stato chiesto Rettangolo e Triangolo):
    1) mi paiono complesse e "contorte"
    2) creaCasuale idem non deve restituire un String


    Ripensa bene il tutto.

    Ho rivisto un po' tutto, seguendo i tuoi consigli.

    Classe Punto
    codice:
    class Punto {
        private int x;
        private int y;
    
    
        //Costruttore
    
        public Punto() {
        }
    
        public Punto(int x, int y) {
            this.x = x;
            this.y = y;
        }
    
        //Getter e Setter di x,y
    
        public int getX() {
            return x;
        }
    
        public void setX(int x) {
            this.x = x;
        }
    
        public int getY() {
            return y;
        }
    
        public void setY(int y) {
            this.y = y;
        }
    
    
        //Metodo creazione punto casuale
    
        public static Punto creaCasuale() {
    
            //Crea Punto Casuale
            Punto staticPunto = new Punto( (int) (20 * Math.random()), (int) (20 * Math.random()));
    
            return staticPunto;
        }
    }
    Classe Triangolo
    codice:
    class Triangolo extends Poligono {
        private double AB, BC, CA;
    
        //Costruttore
        public Triangolo(double AB, double BC, double CA) {
            this.AB = AB;
            this.BC = BC;
            this.CA = CA;
        }
    
        public Triangolo(Punto A, Punto B, Punto C) {
    
            //Formula distanza tra due punti
    
            AB = (int) Math.sqrt(Math.pow((B.getX() - A.getX()), 2) + Math.pow((B.getY() - A.getY()), 2));
            BC = (int) Math.sqrt(Math.pow((C.getX() - B.getX()), 2) + Math.pow((C.getY() - B.getY()), 2));
            CA = (int) Math.sqrt(Math.pow((A.getX() - C.getX()), 2) + Math.pow((A.getY() - C.getY()), 2));
        }
    
        //Metodi getter
    
        public double getAB() {
            return AB;
        }
    
        public double getBC() {
            return BC;
        }
    
        public double getCA() {
            return CA;
        }
    
        //Metodi Perimetro e Area
    
        @Override
        public double getPerimetro() {
            return AB + BC + CA;
        }
    
        @Override
        public double getArea() {
            double halfPerimeter = (AB + BC + CA) / 2;
            return Math.sqrt(halfPerimeter * (halfPerimeter - AB) * (halfPerimeter - BC) * (halfPerimeter - CA));
        }
    
        //Metodi Static creaCasuale
    
        public static Triangolo creaCasuale() {
            //Creo i lati del Triangolo
    
            Triangolo TriCasuale = new Triangolo(((20 * Math.random()) + 1), ((20 * Math.random()) + 1), ((20 * Math.random()) + 1));
    
            return TriCasuale;
        }
    }
    Classe Rettangolo
    codice:
    class Rettangolo extends Poligono{
        private double AB, BC, CD, DA;
    
        //Costruttori
    
        public Rettangolo (double AB, double BC){
            this.AB = AB;
            this.BC = BC;
        }
    
        public Rettangolo(Punto A, Punto B, Punto C, Punto D){
    
            //Formula distanza tra due punti
    
            AB = Math.sqrt( Math.pow( (B.getX() - A.getX() ), 2 ) + Math.pow( (B.getY() - A.getY() ) , 2) );
            BC = Math.sqrt( Math.pow( (B.getX() - A.getX() ), 2 ) + Math.pow( (B.getY() - A.getY() ) , 2) );
            CD = Math.sqrt( Math.pow( (B.getX() - A.getX() ), 2 ) + Math.pow( (B.getY() - A.getY() ) , 2) );
            DA = Math.sqrt( Math.pow( (B.getX() - A.getX() ), 2 ) + Math.pow( (B.getY() - A.getY() ) , 2) );
        }
    
        public double getAB() {
            return AB;
        }
    
        public double getBC() {
            return BC;
        }
    
        public double getCD() {
            return CD;
        }
    
        public double getDA() {
            return DA;
        }
    
        //Metodi Perimetro e Area
    
        @Override
        public double getPerimetro() {
            return (AB + BC) * 2;
        }
    
        @Override
        public double getArea() {
            return AB * BC;
        }
    
        //Metodo Static creaCasuale
    
        public static Rettangolo creaCasuale() {
            //Creo Rettangolo casuale
    
            Rettangolo RetCasuale = new Rettangolo((20 * Math.random()) + 1, (20 * Math.random()) + 1);
    
            return RetCasuale;
        }
    }
    Classe cerchio
    codice:
    class Cerchio extends Poligono{
        private double radius;
        private final double piGreco = 3.14159;
    
        //Costruttori
    
        public Cerchio(double radius) {
            this.radius = radius;
        }
    
        //Metodi getter
    
        public double getRadius() {
            return radius;
        }
    
    
        //Metodo Area e Perimetro non Statici
    
        @Override
        public double getPerimetro() {
            return 2 * radius * piGreco;
        }
    
        @Override
        public double getArea() {
            return Math.pow(radius,2.0) * piGreco;
        }
    
        //Metodi Statici
    
        public static Cerchio creaCasuale() {
    
            Cerchio CerCasuale = new Cerchio((20 * Math.random()) + 1);
    
            return CerCasuale;
        }
    
    }
    Avendo cambiato i metodi creaCasuale, mi sorge una domanda spontanea,
    Come faccio a visualizzare la x e la y del Punto creato casualmente??
    Ho provato cosi, ma non sono sicuro che il primo e il secondo crea casuale si riferiscano allo stesso oggetto.
    codice:
    System.out.println( Punto.creaCasuale().getX() + " " + Punto.creaCasuale().getY());
    Oppure non ha senso stampare la x, e y essendo un metodo statico??

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Classe Punto
    Ok, corretta

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Classe Triangolo
    Qui c'è un problema concettuale. Detto in generale NON ha molto senso costruire un triangolo passando le lunghezze dei lati, perché NON è detto che date 3 lunghezze qualsiasi esse permettano di realizzare davvero la figura chiusa di un triangolo. Se ti dò 3 lunghezze es. 10 70 30 con queste NON fai un triangolo.
    Per un triangolo qualsiasi il modo sensato è passare 3 punti xy sul piano cartesiano.

    Inoltre dovresti cercare di incapsulare e ri-utilizzare meglio i concetti. In Triangolo fai 3 volte

    (int) Math.sqrt(Math.pow(( ...... ecc

    Qui stai cercando di calcolare la distanza tra 2 punti. Che è un concetto abbastanza utile e valido in generale. Allora perché non mettere in Punto questa funzionalità? Il testo iniziale NON proibisce una cosa del genere. Anzi, dice "dopo avere realizzato i metodi che ritieni opportuni"

    Ovvero, in Punto ha assolutamente senso mettere un metodo di istanza che fornisce la distanza tra il punto this (su cui invochi il metodo) e un altro Punto passato in argomento.

    Altro riutilizzo: in creaCasuale di Triangolo ... perché non sfruttare il creaCasuale di Punto?


    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Classe Rettangolo
    Rettangolo è sbagliata concettualmente in modo opposto a Triangolo. Il primo costruttore riceve 2 lati ed HA senso. Il secondo costruttore riceve 4 punti e questo NON ha senso, perché puoi creare qualunque quadrilatero che non è un rettangolo!

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Classe cerchio
    Cerchio ha senso ma semplicemente perché l'unica cosa che gestisci è il raggio, che ovviamente HA senso.
    Tieni anche presente che per il pi greco esiste gìà la costante Math.PI (Math è la classe java.lang.Math).

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Come faccio a visualizzare la x e la y del Punto creato casualmente??
    Ho provato cosi, ma non sono sicuro che il primo e il secondo crea casuale si riferiscano allo stesso oggetto.
    codice:
    System.out.println( Punto.creaCasuale().getX() + " " + Punto.creaCasuale().getY());
    Appunto ... sono due oggetti Punto differenti, quindi creaCasuale usato così ovviamente NON ha senso.

    Se vuoi puoi anche ridefinire il toString() nelle tue classi per fornire una rappresentazione testuale degli oggetti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Trento
    Messaggi
    13
    Rettangolo è sbagliata concettualmente in modo opposto a Triangolo. Il primo costruttore riceve 2 lati ed HA senso. Il secondo costruttore riceve 4 punti e questo NON ha senso, perché puoi creare qualunque quadrilatero che non è un rettangolo!
    Succesivamente nell'ultima classe da creare mi chiede nel metodo toString
    codice:
    
    ciascun poligono si presenterà il tipo (Triangolo, Rettangolo, Cerchio), le sue caratteristiche
    (i vertici o il centro con il raggio) ed infine l'ingombro.
    
    Per il cerchio nel costruttore posso passare un Punto x,y e il raggio come un intero, e qui credo dovrebbe essere giusto concettualmente, mentre per il rettangolo credo di dover passare per forza i 4 punti, a questo punto nel costruttore è possibile mettere delle condizioni tipo if per verificare sia effetivamente un rettangolo? oppure come si potrebbe fare??

    P.S: i tuoi consigli mi sono utilissimi Grazie Mille

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Succesivamente nell'ultima classe da creare mi chiede nel metodo toString
    codice:
    
    ciascun poligono si presenterà il tipo (Triangolo, Rettangolo, Cerchio), le sue caratteristiche
    (i vertici o il centro con il raggio) ed infine l'ingombro.
    
    Per ciascuna classe ridefinirai il toString() componendo una stringa con i dati che ti sono stati chiesti. E li hai tutti, parametri o calcolati che siano.

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Per il cerchio nel costruttore posso passare un Punto x,y e il raggio come un intero, e qui credo dovrebbe essere giusto concettualmente
    Sì, per un cerchio ha senso in genere specificare:
    - punto xy centrale e raggio
    oppure
    - punto xy centrale e diametro

    Sono entrambi sensati.

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    mentre per il rettangolo credo di dover passare per forza i 4 punti
    Perché "per forza"? Dove sta scritto che devi passare 4 punti??

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    a questo punto nel costruttore è possibile mettere delle condizioni tipo if per verificare sia effetivamente un rettangolo?
    Se intendi che i 4 punti siano gli angoli di un rettangolo messo sul piano senza alcuna rotazione (ovvero le linee ideali dei lati sono solo perfettamente orizzontali e verticali), sì, è perfettamente possibile verificare se i punti formano davvero un rettangolo.

    Ma se i 4 punti fossero messi in modo tale da fare un rettangolo con una certa rotazione?? Sarebbe decisamente meno "banale" e più contorto/complesso da verificare.

    E poi c'è ancora un'altra questione. Se vuoi creare un rettangolo "casuale" NON puoi banalmente creare 4 punti casuali. Dovresti generare xy casuali di due angoli opposti e POI costruire i 4 punti.

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    P.S: i tuoi consigli mi sono utilissimi Grazie Mille
    Prego!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Trento
    Messaggi
    13
    Per ciascuna classe ridefinirai il toString() componendo una stringa con i dati che ti sono stati chiesti. E li hai tutti, parametri o calcolati che siano.
    codice:
    
    public String toString(){
            return "[Rettangolo] " + "AB=CD= " + AB + " BC=AC= " + BC + " [Perimetro " + getPerimetro() + "cm ] " + "[Area " + getArea() + "cm^2 ]";
        }
    è concettualmente corretto fare un toString così?? oppure dovrei usare getAB per AB e getBC per BC?? Ci sono più modi cencettualmente corretti per fare un toString?
    Avevo poi pensato di inserire il toString nella classe astratta poligono, ma correggimi se sbaglio, non ha senso perche il toString è gia un metodo di object.

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da megaorso Visualizza il messaggio
    è concettualmente corretto fare un toString così??
    Tecnicamente sì. La forma della stringa risultante non è granché (si può fare meglio) ... è questione di scelte/gusti.

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    oppure dovrei usare getAB per AB e getBC per BC??
    Se non ci sono di mezzo questioni di a) sincronizzazione/concorrenza, b) logiche particolari che un getter potrebbe applicare, usare un campo o un getter nel toString è abbastanza indifferente, detto in generale. Ripeto, se non ci sono altri aspetti da considerare.

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Ci sono più modi cencettualmente corretti per fare un toString?
    La stringa del toString spesso/tipicamente è una stringa molto "tecnica" e serve per logging/debugging o comunque per utenti "tecnici".
    Ma sovente può anche essere mostrata all'utente comune, come nel tuo caso. Quindi la forma dei dati nella stringa dipende appunto da CHI dovrà leggere quella stringa.

    Il framework standard per le classi "bean" di dati usa di norma una forma del tipo

    nome.qualificato.Classe[prop1=xxx,prop2=yyy, ..... ]

    La classe java.awt.Rectangle ad esempio fornisce una stringa

    java.awt.Rectangle[x=10,y=10,width=200,height=100]

    Quote Originariamente inviata da megaorso Visualizza il messaggio
    Avevo poi pensato di inserire il toString nella classe astratta poligono, ma correggimi se sbaglio, non ha senso perche il toString è gia un metodo di object.
    No, NON è quello il problema. Nella tua classe astratta Poligono "sai" solo area e perimetro perché quelli sono i metodi che tutte le sotto-classi concrete sicuramente dovranno offrire. Ma in Poligono non hai e non sai le informazioni più specifiche relative a ciascuna figura.

    Se vuoi generalizzare un po' la forma si può realizzare una piccola architettura di questo tipo: in Poligono metti la implementazione concreta di toString() in cui comporrai la stringa inserendo sicuramente i dati che Poligono "sa". Poi all'interno della composizione userai un metodo es. String infoFigura(). Questo metodo è astratto (e public o anche solo protected) in Poligono e dovrà essere implementato dalle sotto-classi.
    Quindi ciascuna sotto-classe non dovrà più ripetere l'intero toString() ma solo fornire le informazioni specifiche alla sua figura (es. i due lati di un rettangolo o il raggio di un cerchio).
    Ultima modifica di andbin; 15-11-2016 a 12:39
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.