Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [Java] Strano errore di compilazione

    Salve a tutti, sto cercando di compilare il seguente codice in Java:

    codice:
    // CLASSE GENERICA FIGURA
    public abstract class Figura {
    	
    	//METODI ASTRATTI
    	public abstract double getArea();
    	
    	public abstract double getPerimetro();
    	
    	public boolean haAreaMaggiore(Figura altra) {
    		return this.getArea() > altra.getArea();
    	}
    	
    	public boolean haPerimetroMaggiore(Figura altra) {
    		return this.getPerimetro() > altra.getPerimetro();
    	}
    	
    	
    	//CLASSE RETTANGOLO (ESTENSIONE DI FIGURA)
    	public class Rettangolo extends Figura {
    
                      //CAMPI
    		  private double base, altezza;
    
    		  //COSTRUTTORE
    		  public Rettangolo(double x, double y) {
    		    base = x;
    		    altezza = y;
    		  }
    
    		  //METODI
    		  public double getArea() {
    		    return base * altezza;
    		  }
    		   
    		  public double getPerimetro() {
    		    return 2 * (base + altezza);
    		  }
    		   
    		  public double getAltezza() {
    		    return altezza;
    		  }
    		   
    		  public double getBase() {
    		    return base;
    		  }
    		   
    		  public String toString() {
    		    return "base = " + base + ", altezza = " + altezza;
    		  }
    		   
    		  public boolean equals(Rettangolo altro) {
    		    return this.base == altro.base && this.altezza == altro.altezza;
    		  }
    
    		  public boolean equals(Object o) {
    		    if (o instanceof Rettangolo) {
    		      Rettangolo a = (Rettangolo) o;
    		      return equals(a);
    		    } else
    		      return false;
    		  }
    
    		  public void cambiaBase(double x) {
    		    base = x;
    		  }
    
    		  public void cambiaAltezza(double x) {
    		    altezza = x;
    		  }
    	}
    	
    	
    	//CLASSE QUADRATO (ESTENSIONE DI RETTANGOLO)
    	public class Quadrato extends Rettangolo {
    
                      //COSTRUTTORE
    		  public Quadrato(double x) {
    		    super(x, x);     //ERRORE!!!   
    		  }
    
                      //METODI
    		  public double getLato() {
    		    return getBase();
    		  }
    
    		  public String toString() {
    		    return "lato = " + getLato();
    		  }
    
    		  public void cambiaLato(double x) {
    		    super.cambiaBase(x);
    		    super.cambiaAltezza(x);
    		  }
    
    		  public void cambiaBase(double x) {
    		    cambiaLato(x);
    		  }
    
    		  public void cambiaAltezza(double x) {
    		    cambiaLato(x);
    		  }
    
    	}
    	
    	
    	//CLASSE CERCHIO (ESTENSIONE DI FIGURA)
    	public class Cerchio extends Figura {
    		
    		//CAMPI
    		private double r;
    		
    		//COSTRUTTORE
    		public Cerchio(double raggio) {
    			r = raggio;
    		}
    		
    		//METODI
    		public double getArea() {
    			return Math.PI * r * r;
    		}
    		
    		public double getPerimetro() {
    			return 2 * Math.PI * r;
    		}
    		
    		public boolean equals(Cerchio altro) {
    			return this.r == altro.r;
    		}
    		
    		public boolean haAreaMaggiore(Cerchio altro) {
    			return this.getArea() > altro.getArea();
    		}
    		
    		public boolean haPerimetroMaggiore(Cerchio altro) {
    			return this.getPerimetro() > altro.getPerimetro();
    		}
    		
    		public double getRaggio() {
    			return r;
    		}
    		
    		public String toString() {
    			return "raggio = " + getRaggio();
    		}
    	}
    }
    Alla riga indicata dal commento però, quando lancio il debug, Eclipse continua a restituirmi il seguente messaggio di errore:
    "No enclosing instance of type Figura is available due to some intermediate constructor invocation"

    Ho provato anche a compilare da Shell, ma il messaggio d'errore è molto simile (sempre alla stessa riga):
    "Cannot reference this before supertype constructor has been called"

    Qualcuno saprebbe darmi qualche consiglio?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Strano errore di compilazione

    Originariamente inviato da nicostyle86
    Alla riga indicata dal commento però, quando lancio il debug, Eclipse continua a restituirmi il seguente messaggio di errore:
    "No enclosing instance of type Figura is available due to some intermediate constructor invocation"
    Il problema è che hai fatto delle "inner class", ovvero Rettangolo/Quadrato/Cerchio sono classi "innestate" in Figura.

    Devi proprio fare così (ti è stato chiesto espressamente, per qualche ragione che non conosco)?
    Se non devi fare così .... metti tutte le classi come "top-level" ovvero nessuna dentro un'altra.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Si, viene specificato chiesto di realizzare una struttura di questo tipo per apprezzare i vantaggi dell'ereditarietà e del polimorfismo, senza contare che se dovessi "staccare" ogni classe dall'altra dovrei riscrivere costruttori e metodi di Quadrato perdendo il vantaggio dei metodi ereditati da Rettangolo.

    La cosa strana è che realizzando un'altra classe di prova, dove ho utilizzato la stessa struttura di Figura, la stessa riga di codice non viene segnalata in fase di compilazione e tutto va bene. Non riesco proprio a capire.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da nicostyle86
    Si, viene specificato chiesto di realizzare una struttura di questo tipo per apprezzare i vantaggi dell'ereditarietà e del polimorfismo
    Ma questo non centra nulla con le "inner class".

    Le inner class definiscono una relazione "fisica" tra le classi. L'ereditarietà è un'altra cosa ..... e per "ereditare" non devi certo per forza mettere la sottoclasse fisicamente dentro la superclasse!!!

    Originariamente inviato da nicostyle86
    se dovessi "staccare" ogni classe dall'altra dovrei riscrivere costruttori e metodi di Quadrato perdendo il vantaggio dei metodi ereditati da Rettangolo.
    No assolutamente. Non è affatto vero.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Si, hai ragione ho fatto confusione. Quindi il tuo consiglio sarebbe spezzare le classi in più files?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da nicostyle86
    Si, hai ragione ho fatto confusione. Quindi il tuo consiglio sarebbe spezzare le classi in più files?
    Precisiamo: in un sorgente .java puoi dichiarare più classi "top-level". C'è solo una restrizione: solo 1 classe al massimo tra quelle nel sorgente può essere "public".

    Quindi se è un esercizio o progettino semplice puoi anche metterle tutte nello stesso sorgente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326

    Moderazione

    Come indicato nel Regolamento interno, quando si posta del codice, esso deve essere indentato e si devono utilizzare gli appositi tag CODE. Vedi il punto 6, che mostra anche come usarli.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Le ho messe in files diversi e adesso funziona tutto perfettamente, mantenendo inalterata la gerarchia delle classi.

    Tornando a quello che hai detto:
    Originariamente inviato da andbin
    Precisiamo: in un sorgente .java puoi dichiarare più classi "top-level". C'è solo una restrizione: solo 1 classe al massimo tra quelle nel sorgente può essere "public".
    Quindi non c'è proprio un modo per aggirare quell'errore mantenendo la struttura di classi innestate?

  9. #9

    Re: Moderazione

    Originariamente inviato da LeleFT
    Come indicato nel Regolamento interno, quando si posta del codice, esso deve essere indentato e si devono utilizzare gli appositi tag CODE. Vedi il punto 6, che mostra anche come usarli.


    Ciao.
    A dire la verità li cercavo, ma non li ho trovati . Farò più attenzione prossimamente.

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326

    Re: Re: Moderazione

    Originariamente inviato da nicostyle86
    A dire la verità li cercavo, ma non li ho trovati . Farò più attenzione prossimamente.
    In effetti, questo tipo di tag non è descritto, come gli altri.
    Per inserirlo "automaticamente" si deve premere il pulsante ( # ), ma in questo modo risulta di difficile gestione: è più semplice scriverli direttamente.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.