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

    [JAVA] Classi astratte...dubbi

    Ciao,
    purtroppo non ho ancora il manuale di Java vero e prorpio (lo prenderò a giorni) e per ora stò usando solo un altro testo di programmazione OO generico e gli appunti.

    Proprio oggi stavo rivedendo i miei appunti ed ho qualche domandina sulle classi astratte e sulle interface.

    Praticamente da quello che ho capito una classe abstract è semplicemente una classe che definisce un tipo molto generico di oggetti da cui estenderò vari tipi di oggetti figli della classe abstract.

    Nella classe abstract ci saranno sia dei metodi implementati che sono validi per ogni tipo di oggetto figlio, sia dei metodi dichiarati come abstract che saranno implementati di volta in volta nei vari figli (perchè magari si comportano in maniera diversa per ogni figlio)

    Tipo ho una classe Poligono che mi rappresenta generici poligoni, dove il metodo perimetro che è valido per ogni poligono viene impelentato ed il metodo area viene dichiarato abstract in questo modo:

    codice:
    public abstract class Poligono{
    	protectd double[] lati;			// Array che contiene la lunghezza dei lati del poligono	
    	protected double[] angoli;		// Array che contiene gli angoli tra i lati in gradi
    	
    	public double perimetro{		// E' un metodo valido per qualsiasi tipo di poligono e viene implementato
    		int i;
    		double p = 0;
    		
    		for(i=0; i<lati.legth; i++)
    			p += lati[i];
    			
    		return p;
    	}
    	
    	abstract public double area();	// Lo dichiaro abstract e non lo implemento perchè varia da poligono a poligono
    }
    ed una classe Quadrato che estende Poligono ed in cui è implementato il metodo area per un poligono particolare che è un quadrato:

    codice:
    public class Quadrato extends Poligono{
    	
    	public Quadrato(double lato){
    		super({lato,lato,lato,lato}; {90,90,90,90});	// Inizializza gli array di istanza con il costruttore del padre
    	}
    	
    	public double area(){		// Implemento il metodo area per Quadrato (dichiarato abstract in Poligono)
    		return lato[0] * lato[0];
    	}
    }
    DOMANDE:

    1) Perchè Quadrato non mi si compila? sarà un errore sintattico...mi trova un sacco di errori...credo che dipende da come ho scritto gli array nel costruttore super.

    2) Perchè in questo esempio in Poligono non è stato dichiarato un costruttore?!?! Quando invoco il costruttore di Quadrato viene invocato super (che dovrebbe essere il costruttore della classe padre, quindi di Poligono, giusto?) quindi che invoca? come fa a mettere i valori {lato,lato,lato,lato}; {90,90,90,90} dentro i due array lati ed angoli!??! C'è qualcosa di sbagliato o mi stàsfuggendo qualcosa?

    3) Perchè questa volta la proff dentro Poligono ha dichiarato protectd i due array di istanza enon private? è perchè devono essere visibili anche da Quadrato che dovrebbe essere nello stesso package?

    Grazie
    Andrea

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

    Re: [JAVA] Classi astratte...dubbi

    Originariamente inviato da AndreaNobili
    Praticamente da quello che ho capito una classe abstract è semplicemente una classe che definisce un tipo molto generico di oggetti da cui estenderò vari tipi di oggetti figli della classe abstract.
    Sì, l'obiettivo generalmente è quello .... fare da classe "base". Ma il motivo principale per cui si dichiara una classe "abstract" è quando si sa a priori che la classe rappresenta una qualche entità per cui non ha senso/utilità poterla istanziare perché gli "manca" qualcosa a livello di dettagli implementativi, che solo sottoclassi che rappresentano qualcosa di più concreto possono fornire.

    Originariamente inviato da AndreaNobili
    Nella classe abstract ci saranno sia dei metodi implementati che sono validi per ogni tipo di oggetto figlio, sia dei metodi dichiarati come abstract che saranno implementati di volta in volta nei vari figli (perchè magari si comportano in maniera diversa per ogni figlio)
    Sì, questo è uno scenario tipico/plausibile. Anche se ovviamente non è obbligatorio avere un mix di metodi concreti e metodi astratti.

    Originariamente inviato da AndreaNobili
    Tipo ho una classe Poligono che mi rappresenta generici poligoni, dove il metodo perimetro che è valido per ogni poligono viene impelentato ed il metodo area viene dichiarato abstract in questo modo:
    La tua classe Poligono mi sembra un pochino "naïf" ... nel senso che non vedo l'utilità di avere la indicazione di lati e angoli (che succede se volutamente o no si mettono dei dati incongruenti??)

    Originariamente inviato da AndreaNobili
    1) Perchè Quadrato non mi si compila? sarà un errore sintattico...mi trova un sacco di errori...credo che dipende da come ho scritto gli array nel costruttore super.
    Già .... ma innanzitutto quale super-costruttore?? Non vedo nessun costruttore in Poligono!! C'è solo il costruttore di "default" che è senza argomenti.

    Poi la sintassi .... è completamente sbagliata. A parte il ; di troppo, non puoi passare direttamente a un metodo dei valori solamente dentro { } ... domanda: di che tipo è l'array?? Non è indicato!!! Appunto ... andrebbe usato quello che si chiama "anonymous" array. Ma come ripeto ... manca il super-costruttore (ma vedi risposta sotto)

    Originariamente inviato da AndreaNobili
    2) Perchè in questo esempio in Poligono non è stato dichiarato un costruttore?!?! Quando invoco il costruttore di Quadrato viene invocato super (che dovrebbe essere il costruttore della classe padre, quindi di Poligono, giusto?) quindi che invoca? come fa a mettere i valori {lato,lato,lato,lato}; {90,90,90,90} dentro i due array lati ed angoli!??! C'è qualcosa di sbagliato o mi stàsfuggendo qualcosa?

    3) Perchè questa volta la proff dentro Poligono ha dichiarato protectd i due array di istanza enon private? è perchè devono essere visibili anche da Quadrato che dovrebbe essere nello stesso package?
    Essendo quei campi marcati protected, li puoi "vedere" anche nelle sottoclassi (e da altre classi nello stesso package), quindi anche da Quadrato. Nel costruttore di Quadrato potresti assegnare i valori direttamente ai campi ... senza bisogno di invocare esplicitamente un super-costruttore.

    Non mi sembra affatto, comunque, un buon "design".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    mmm si diciamo che era un primo esempio per farci capire cos'è una classe abstract...

    Quindi praticamente mi stai dicendo che nella classe Poligono manca il costruttore e che in Quadrato richiamo il costruttore di default con super e che in questo caso posso assegnare i valori direttamente a due array di istanza perchè sono dichiarati protected e quindi la clase figlio li vede?

    Per favore potresti darmi la giusta sinstassi affinchè compiliti?

    Grazie
    Andrea

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da AndreaNobili
    Quindi praticamente mi stai dicendo che nella classe Poligono manca il costruttore
    Non è che manca ..... almeno 1 costruttore esiste comunque sempre! Se il programmatore non ne definisce nemmeno 1, il compilatore ne inserisce uno di "default".

    Originariamente inviato da AndreaNobili
    e che in Quadrato richiamo il costruttore di default con super
    Se in Quadrato vuoi mettere:

    super();

    tecnicamente è corretto .... ma è superfluo. Anche qui ci sono delle regole (che forse dovresti studiare meglio): la prima istruzione di un costruttore deve essere una invocazione di un costruttore con this() o super() (con o senza argomenti). Se il programmatore non mette esplicitamente la invocazione di un costruttore, il compilatore mette per default un super() senza argomenti.

    Originariamente inviato da AndreaNobili
    e che in questo caso posso assegnare i valori direttamente a due array di istanza perchè sono dichiarati protected e quindi la clase figlio li vede?
    Sì.

    Originariamente inviato da AndreaNobili
    Per favore potresti darmi la giusta sinstassi affinchè compiliti?
    codice:
    public Quadrato(double lato) {
        lati = new double[] {lato,lato,lato,lato};
        angoli = new double[] {90,90,90,90};
    }
    E nota bene il new double[]
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.