Aiuto Ridefinizioni metodi.

di il
4 risposte

Aiuto Ridefinizioni metodi.

Giunto all'argomento esposto nel titolo, ho voluto fare un esercizio standard dove da una classe Quadrilatero ne derivava una rettangolo da cui ne derivava una quadrato. Utilizzando lo stesso metodo calcoloPerimetro() va tutto alla grande, quando però devo calcolare l'area qualcosa non va, e davvero non capisco cosa! ecco il codice MAIN..
public class MainProgram {
           public static void main(String[] args) {
	
        	   Quadrilatero a = new Quadrilatero(5,5,10,4);
        	   Rettangolo b = new Rettangolo (7,19,10);
        	   Quadrato c = new Quadrato (4);
        	   
        	 int Pa = a.calcolaPerimetro(); System.out.println(Pa);
        	  int Pb = b.calcolaPerimetro(); System.out.println(Pb);
        	  int Pc = c.calcolaPerimetro(); System.out.println(Pc);
        	  int Aa = a.calcoloArea(); System.out.println(Aa);
        	  int Ab = b.calcoloArea(); System.out.println(Ab); 
        	  int Ac = c.calcoloArea(); System.out.println(Ac);
		}
}
ora quello della classe Quadrilatero

public class Quadrilatero {
	
	private int latoA,latoB,latoC,latoD; //lati del quadrilatero
	
//Costruttore
public Quadrilatero(int a,int b, int c,int d) {
	latoA = a; latoB=b; latoC = c; latoD = d;
}
//vari metodi
   public int calcolaPerimetro() {
	return latoA + latoB + latoC + latoD;
}
   public int calcoloArea() {
	return (latoA*latoB*2);
}

}
ora quello della classe Rettangolo

public class Rettangolo extends Quadrilatero {
	
	int latoA,latoB;
	private int colore;
	//Costruttore
	public Rettangolo(int a,int b,int c) {
		super(a,b,a,b);
		colore = c;
	}
    public Rettangolo (int a,int b) {
		this(a,b,0);
		} 
		 
	
	//metodo colore
	public int getColore() {
		return colore;
	} 
	
	public int calcoloArea() {
		return latoA*latoB;
	}
   
}
ed infine quello della classe quadrato

public class Quadrato extends Rettangolo {
	int latoA;
	
	//costruttore
	public Quadrato(int a) {
		super (a,a);
	}
	public int calcoloArea() {
		return (latoA*latoA);
	}
}
perchè le aree del rettangolo e del quadrato sono date a 0?

4 Risposte

  • Re: Aiuto Ridefinizioni metodi.

    ercucchiaio ha scritto:


    perchè le aree del rettangolo e del quadrato sono date a 0?
    Tecnicamente perché in Rettangolo e Quadrato ci sono le variabili di istanza dei lati che NON stai gestendo (e infatti non dovrebbero esserci), quindi restano a 0, pertanto il risultato di calcoloArea è facilmente comprensibile.

    Comunque il concetto generale di questa gerarchia che hai fatto è molto critico e concettualmente in parte errato.
  • Re: Aiuto Ridefinizioni metodi.

    Potresti farmi capire il motivo? Sto studiando java da un libro e francamente ho iniziato nemmeno una settimana scorsa quindi figurati se non sono consapevole di fare continue cagate..le faccio per capire comunque


    edit: e più che altro come non far uscire zero!! tipo per calcolare il perimetro va tutto bene, per calcolare l'area no??
  • Re: Aiuto Ridefinizioni metodi.

    Voler imparare a programmare partendo da un linguaggio di programmazione che supporta solo la programmazione ad oggetti, non e' una grande idea.
    Per prima cosa devi capire i concetti che stanno alla base di questo paradigma di programmazione.
    Non sono difficili, ma certamente non si possono spiegare in un post (che sarebbe lungo quanto diversi ca[itoli di un libro), ma vanno studiati da un libro che introduca i principi della programmazione.

    Ti serve aver chiaro concetti come
    - classe
    - istanza
    - membri di istanza
    - ereditarieta'
    - overloading

    Per ora risolvi cosi': reimplementa 'calcolaPerimetro' in ogni classe derivata.
  • Re: Aiuto Ridefinizioni metodi.

    ercucchiaio ha scritto:


    Potresti farmi capire il motivo?
    Partiamo da Quadrilatero, lo costruisci passando 4 valori. Tu potresti passare dei valori che in realtà NON fanno affatto un quadrilatero chiuso! Già questo ha poco senso.

    Quadrilatero è un concetto abbastanza generico, quindi avrebbe più senso rendere Quadrilatero una classe astratta (o al limite una interfaccia) e che non contiene "stato" e dove i metodi principali calcolaPerimetro/calcoloArea sono astratti perché questi devono essere implementati in sottoclassi concrete.

    Poi, nonostante hai 4 lati, avere un calcolaArea concreto che fa (latoA*latoB*2) non ha senso ... non è quella l'area! Mi pare esiste una formula per il calcolo dell'area di un quadrilatero generico ... non la so di preciso ma mi pare sia ben più complessa.

    Andiamo poi alla annosa (e conosciuta) questione Quadrato extends Rettangolo. In senso generale della OOP questo non va fatto! Potrebbe funzionare (concettualmente oltre che tecnicamente) in casi limitati ma bisognerebbe vedere come è fatto Rettangolo.

    Se Rettangolo fosse "mutabile" e avesse metodi es. setLatoA e setLatoB, allora estenderlo per fare Quadrato sarebbe assolutamente sbagliato. Il concetto di Rettangolo è che i due lati (base e altezza) devono poter essere differenti mentre Quadrato impone il vincolo che invece siano sempre uguali! Nella OOP questa chiusura, restrizione, non è accettabile.

    Non vado avanti ... basta che cerchi in rete, es.
Devi accedere o registrarti per scrivere nel forum
4 risposte