Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [JAVA] - Sotto classi

  1. #1

    [JAVA] - Sotto classi

    Ciao a tutti!
    Rifacendomi un pò ai problemi riscontrati in questo post, volevo farvi delle domande su superclassi e sottoclassi.
    Io ho una classe generica MyFile, che ha per semplicità un unico costruttore MyFile(String formato, int size, String percorso). Le sottoclassi di questa classe avranno quindi dati d'ingresso diversi; ad esempio una classe AudioFile può avere un costruttore del genere: AudioFile(String formato, int size, String percorso, int durataFile).

    Come faccio a gestire questa sottoclasse? Nel senso: come faccio a dire questa sottoclasse ha gli stessi parametri d'ingresso della superclasse più la durata?
    Devo necessariamente dare di nuovo tutti i paramentri espliciti al costruttore e aggiungere quelli nuovi? O c'è un modo per dare come parametro d'ingresso solo il nuovo parametro durata?

    E inoltre: cosa devo specificare nel corpo del costruttore della sottoclasse? Perchè devo definire necessariamente un costruttore nuovo nella superclasse?

    Spero di essere stato abbastanza chiaro. Per chiarezza provo a fare un esempio qui sotto.

    Grazie mille a tutti!!!

  2. #2
    codice:
    MyFile 
    
    /**
     * A class to manage files
     * @author Simone
     *
     */
    public class MyFile
    {
    	public MyFile()
    	{
    		/*
    		 * Non inizializza nulla. Il mio primo dubbio è proprio su questo costrut-
    		 * tore: non capisco perchè devo creare un costruttore vuoto, senza pare-
    		 * metri espliciti. Dall'altro lato, se non lo creo, tutte le sottoclassi
    		 * presentano un errore
    		 */
    		
    	}
    	
    	/*
    	 * Costruisce un nuovo file coi parametri stabiliti
    	 * @param type tipo file (audio, testo, immagine, video)
    	 * @param path percorso file
    	 * @param size grandezza file
    	 */
    	public MyFile(String type, String path, int size)
    	{
    		this.type = type;
    		this.path = path;
    		this.size = size;
    	}
    
    	/*
    	 * da qui in avanti ci sono tutti i metodi getters e setters dei costruttori
    	 * della classe
    	 */
    
    	public String getType()
    	{
    		return type;
    	}
    	public String getPath()
    	{
    		return path;
    	}
    	public int getSize()
    	{
    		return size;
    	}
    
    	public void setType(String type)
    	{
    		this.type = type;
    	}
    
    	public void setPath(String path)
    	{
    		this.path = path;
    	}
    
    	public void setSize(int size)
    	{
    		this.size = size;
    	}
    
    	private String type;
    	private String path;
    	private int size;
    }
    
    
    /////////////////
    
     AudioFile 
    
    /**
     * A class to manage audio files
     * @author Simone
     *
     */
    public class AudioFile extends MyFile
    {	
    	public AudioFile(String type, String path, int size, int length)
    	{
    		super.setType(type);
    		super.setPath(path);
    		super.setSize(size);
    		this.length = length;
    	}
    
    	public int getLength()
    	{
    		return length;
    	}
    	
    	private int length;
    }

  3. #3
    Quando estendi una superclass, ne erediti metodi e attributi e li puoi richiamare nella subclass oppure farne l'override riscrivendoli completamente.
    Una subclass ha sempre la possibilità di richiamare metodi della superclass tramite la keyword super, che nel tuo caso verrà usata nel costruttore della subclass, quindi:

    codice:
    public class MyFile {
        public MyFile (String formato, int size, String percorso) {
            ...
        }
    
        public String getFileInfo () {
            StringBuilder sb = new StringBuilder(formato);
            sb.append(size.toString());
            sb.append(percorso);
            return sb.toString();
        }
    
    public class AudioFile {
        private int lunghezzaTraccia;
        public AudioFile (String formato, int size, String percorso, int lunghezzaTraccia) {
            super (formato, size, percorso);
            this.lunghezzaTraccia = lunghezzaTraccia;
        }
    
        public String getFileInfo () {
            StringBuilder sb = new StringBuilder(super.getFileInfo());
            sb.append(lunghezzaTraccia.toString());
            return sb.toString();
        }
    }
    }
    lolide
    Java Programmer

    Informati

  4. #4
    Originariamente inviato da lolide
    Quando estendi una superclass, ne erediti metodi e attributi e li puoi richiamare nella subclass oppure farne l'override riscrivendoli completamente.
    Una subclass ha sempre la possibilità di richiamare metodi della superclass tramite la keyword super, che nel tuo caso verrà usata nel costruttore della subclass, quindi:
    ...

    Quindi in pratica nell'esempio che ho fatto i metodi setters della super classe non mi servono a nulla?basta fare
    codice:
    AudioFile(*parametri*, int durata)
    {
         super (*parametri*);
         this.durata = durata;
    }
    
    //....
    
    private int durata;
    Questo è il miglior modo per creare una sottoclasse? Non si potrebbe per esempio dare come parametro del costruttore qualcosa come
    codice:
    AudioFile(MyFile, int durata){...}
    Inoltre perchè mi richiede di creare un costruttore vuoto nella superclasse??

    Grazie mille!!!

  5. #5
    Originariamente inviato da tigerjack89
    Quindi in pratica nell'esempio che ho fatto i metodi setters della super classe non mi servono a nulla?basta fare
    Questo è il miglior modo per creare una sottoclasse? Non si potrebbe per esempio dare come parametro del costruttore qualcosa come
    codice:
    AudioFile(MyFile, int durata){...}
    Non è che c'è un modo migliore... AudioFile è una sottoclasse per natura di MyFile, e quindi MyFile andrebbe esteso e non passato come parametro. COmunque passando un oggetto MyFile non è sbagliato dal punto di vista di compilazione, ma è sbagliato dal punto di vista della programmazione ad oggetti.

    Originariamente inviato da tigerjack89
    Inoltre perchè mi richiede di creare un costruttore vuoto nella superclasse??

    Grazie mille!!!
    Te lo chiede perchè AudioFile non ha nessun costruttore che inizializza MyFile... nel senso:

    codice:
    public class MyFile {
    
    	/*
    	 * Costruisce un nuovo file coi parametri stabiliti
    	 * @param type tipo file (audio, testo, immagine, video)
    	 * @param path percorso file
    	 * @param size grandezza file
    	 */
    	public MyFile(String type, String path, int size)
    	{
    		this.type = type;
    		this.path = path;
    		this.size = size;
    	}
    }
    public class AudioFile extends MyFile
    {
    	public AudioFile(String type, String path, int size, int length)
    	{
                    super (type, path, size); 
    		super.setType(type);
    		super.setPath(path);
    		super.setSize(size);
    		this.length = length;
    	}
    }
    Se estendi una classe, ne devi richiamare almeno un costruttore... siccome AudioFile non richiama il costruttore con i 3 parametri, ti chiede di fare un costruttore vuoto... ma avresti infatti risolto mettendo quel super() che ho aggiunto al costruttore di AudioFile.
    lolide
    Java Programmer

    Informati

  6. #6
    Originariamente inviato da lolide
    ...
    Quindi a questo punto i mettodi setters della superclasse, in questo specifico caso, non mi servono più...giusto?

    Altra domanda: se io volessi estendere un metodo della superclasse, posso richiamarlo?
    Cioè ad esempio se ho questo metodo della classe MYFile
    codice:
           /**
    	 * Print on an object of PrintStream
    	 * @param p PrintStream object
    	 */
    	public void print(PrintStream p)
    	{
    		p.println(type);
    		p.println(path);
    		p.println(size);
    	}
    nella classe Audio File posso definire un metodo del genere
    codice:
    @Override
    	public void print(PrintStream p)
    	{
    		super.print(p);
    		p.println(length);
    	}
    Lo so che sono rompipalle, ma finchè non capisco una cosa alla perfezione non riesco ad andare avanti . Grazie ancora per la tua disponibilità

  7. #7
    Originariamente inviato da tigerjack89
    Quindi a questo punto i mettodi setters della superclasse, in questo specifico caso, non mi servono più...giusto?
    No, non servono piu'.

    Originariamente inviato da tigerjack89
    Altra domanda: se io volessi estendere un metodo della superclasse, posso richiamarlo?
    Cioè ad esempio se ho questo metodo della classe MYFile
    Ho fatto un esempio del genere nella risposta sopra con il metodo getFileInfo()... quindi si, come hai fatto tu è corretto.
    lolide
    Java Programmer

    Informati

  8. #8
    Originariamente inviato da lolide
    ...
    nice!! Grazie mille per tutto allora!!
    Se hai tempo potresti dare un'occhiata a questo 3d
    A dispetto della lunghezza, è molto più semplice di quanto possa sembrare. Tieni conto che ho migliorato la superclasse e la sottoclasse come mi hai consigliato; quindi praticamente i post fondamentali sono il primo e l'ultimo.
    Grazie ancora

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da tigerjack89
    Se hai tempo potresti dare un'occhiata a questo 3d
    Nelle discussioni non si fanno riferimenti incrociati ad altri thread, a meno che non servano come spunto per segnalare un problema analogo a quello riscontrato, in ogni caso non si fanno mai per chiedere ad altri di valutare un'altra domanda; in secondo luogo, il thread è stato chiuso per le motivazioni espresse sia pubblicamente che in privato.

    Invito a leggere il regolamento interno di quest'area e limitare gli interventi nelle discussioni ai soli messaggi utili ai fini della risoluzione del problema specifico posto all'interno del thread.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.