Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Programma modelli bidimensionali e poliformismo

    Ciao ragazzi,

    Mi sono incaglliato in un altro problemino e non so proprio come uscirne.
    Il testo dell'esercizio è questo:
    "Si organizzi una gerarchia di classi che modelli figure geometriche bidimensionali (cerchi, triangoli, rettangoli, poligoni regolari e irregolari) e tridimensionali (sfere, cubi, coni, cilindri, tetraedri). Si considerino gli attributi cone superficie, volume, colore, perimetro e si individuino in particolare i casi in cui il polimorfismo può ssere utilizzato per astrarre alcuni attributi delle figure, pur effettuando computazioni diverse a seconda della figura."

    Ho realizzato quindi le classi Figura.java che contiene i metodi per tutte le classi figlie, per esempio:
    codice:
    public double calcolaPerimetro()
    	{
    		String classe=this.getClass().toString();
    		switch (classe)
    		{
    			case "class Rettangolo":
    				return base*altezza;
    			case "class Triangolo":
    				return base*altezza/2;
    			case "class Cerchio":
    				return 2*raggio*3.14; 
    			case "class PoligonoRegolare":
    				return this.getLato();
    			default :
    			return -1;
    		}			
    	}
    E questa è una delle classi figlie:

    codice:
    public class PoligonoRegolare extends Figura
    {
    	private double apotema,lato;
    	private int n; // numero di lati
    	public PoligonoRegolare(String colore, int n, double apotema,double lato)
    	{
    		super(colore);
    		this.n=n;
    		this.lato=lato;
    		this.apotema=apotema;
    	}
    	public double getApotema()
    	{
    		return apotema;
    	}
    	public double getLato()
    	{
    		return lato;
    	}
    	public int getN()
    	{
    		return n;
    	}
    	
    }
    Il problema è che il metodo della classe figura non riesce a vedere i parametri delle classi figlie, ne direttamente ne invocando i metodi Get che ho creato per ciascun parametro. Ho pensato anche di passare i parametri normalmente, ma anche se funziona non mi sembra una soluzione molto pulita.

    Grazie.

    Roberto

  2. #2
    Vi prego Admin correggete il titolo del post!

    Se notate, ho scritto poliformismo al posto di polimorfismo e non so proprio come correggere.

    Grazie mile.
    Roberto

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Ma proprio no... calcolaPerimetro() come calcolaArea() dovrebbero essere due metodi astratti nella classe Figura... che vanno poi implementati (concretizzati) nelle classi figlie, realizzando così il polimorfismo.

    Non ha alcun senso (ed è concettualmente sbagliatissimo) mettere nella classe base riferimenti a classi figlie... la classe base non saprà mai quante classi figlie si possono derivare da essa (e te lo dico io: infinite!).


    Dovresti rivedere meglio i concetti di ereditarietà e di polimorfismo.


    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

  4. #4
    Hai perfettamente ragione non fila per nulla quello che ho fatto...

    Gli ho dato una sistemata ora, puoi verificare che tutto vada per il verso giusto?

    codice:
    public abstract class Figura
    {
    	private String colore;
    	public Figura(String colore)
    	{
    		this.colore=colore;
    	}
    	
    	public String getColore()
    	{
    		return colore;
    	}		
    }
    codice:
    public abstract class Figura2d extends Figura
    {
    	private String colore;
    	public Figura2d(String colore)
    	{
    		super(colore);
    	}
    		
    	public abstract double getPerimetro();
    	public abstract double getArea();	
    }
    codice:
    public class Cerchio extends Figura2d
    {
    	private double raggio;
    	public Cerchio(String colore, double raggio)
    	{
    		super(colore);
    		this.raggio=raggio;
    	}
    	public double getRaggio()
    	{
    		return raggio;
    	}
    	public double getArea()
    	{
    		return (raggio*raggio)*3.14;
    	}
    	public double getPerimetro()
    	{
    		return raggio*2*3.14;
    	}
    	
    }
    codice:
    public class Test
    {
    	
    	public static void main(String []args)
    	{
    		Cerchio c1=new Cerchio("rosso",3.0);
    
    		System.out.println("Colore: "+c1.getColore());
    		
    		double area=c1.getArea();
    		System.out.println("Area: "+area);
    	}
    }
    L'output di Test é:
    Colore: Rosso
    Area: 28.16

    Ho creato delle sottoclassi astratte a Figura, chiamate figura2d e figura3d avendo metodi e parametri completamente diversi.
    L'unico metodo in comune risulta getColore() che ho lasciato sotto Figura.

    Grazie mille.

    Roberto Remondini

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Mi sembra corretto. Unico suggerimento (so che è un'inezia, ma visto che abbiamo gli strumenti, tanto vale usarli per bene): il valore del PI Greco lo trovi, molto più preciso, all'interno della classe Math. In questo modo puoi ottenere risultati più precisi:

    codice:
    	public double getArea()
    	{
    		return (raggio*raggio)*Math.PI;
    	}
    	public double getPerimetro()
    	{
    		return raggio*2*Math.PI;
    	}
    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

  6. #6
    Grazie veramente tanto Lele.

    Anche per il Math.PI che ovviamente è più corretto, lo so:-)


    Ciao!

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.