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

    Help su ereditarietà delle classi

    Ciao a tutti,
    Sto svolgendo un'esercitazione ma ho dei dubbi sull'ereditarietà delle classi in java.
    Il manuale che sto seguendo ne parla talmente leggermente che non si degna nemmeno di fare un esempio, ed allora eccomi qui dai voi:-)

    Ho due semplici classi, la classe libro è la classe madre:
    codice:
    public class Testo 
    {
    	private String 	id;
    	private String editore;
    	private int pagine;
    	private String categoria;
    	
    	public Testo(String editore, int pagine, String categoria)
    	{
    		this.editore=editore;
    		this.pagine=pagine;
    		this.categoria=categoria;
    	}	
    }
    
    //QUESTA è LA CLASSE FIGLIA
    
    public class Libro extends Testo 
    {
    	private String titolo;
    	private String genere;
    	private String scrittore;
    	
    	public Testo(String titolo,String genere, String scrittore,String dataPubblicazione)
    	{
    		this.titolo=titolo;
    		this.genere=genere
    		this.scrittore=scrittore;
    		this.dataPubblicazione=dataPubblicazione;
    	}
    	
    	
    }
    Ma come mi devo comportare per quanto riguarda il metodo costruttore? Quando vado a compilare la classe figlia mi dice che mancano dei parametri, che guarda caso sono i parametri della classe Testo...tutti i parametri della classe da cui deriva.

    Ok che la figlia deve avere tutti i parametri della classe da cui deriva, ma mica dovrò riscrivere il costruttore con i parametri della classe madre, vero?

    Mentre quando istanzio la classe, dovrò usare tutti i parametri, vero?

    Grazie mille a tutti!

    Roberto

  2. #2
    puoi procedere in diversi modi:
    codice:
    	public Testo(Libro libro, String titolo,String genere, String scrittore,String dataPubblicazione)
    	{
                    super(libro);
    		this.titolo=titolo;
    		this.genere=genere
    		this.scrittore=scrittore;
    		this.dataPubblicazione=dataPubblicazione;
    	}
    oppure
    codice:
     	public Testo(String editore, int pagine, String categoria, String titolo,String genere, String scrittore,String dataPubblicazione)
    	{
    		super(editore, pagine, categoria);
                    this.titolo=titolo;
    		this.genere=genere
    		this.scrittore=scrittore;
    		this.dataPubblicazione=dataPubblicazione;
    	}
    ovviamente nel primo caso devi avere il costruttore di copia nella classe madre

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da franksisca
    ovviamente nel primo caso devi avere il costruttore di copia nella classe madre
    una nota: so che per costruttore di copia tu intendi uno che partendo da una istanza di Libro ne crea un'altra, ma in il concetto di "costruttore di copia" è più del C++ che di Java e nella definizione di gerarchie di classi può confondere. Oltretutto trovo alquanto pericoloso mettere nel costruttore della classe padre un riferimento alla classe figlia (al max lo terrei della classe padre).
    In Java quello che a mio parere più si avvicina al concetto di costruttore di copia (inteso come colui che crea una copia dell'istanza corrente) è clone, spero di essermi spiegata su quello che voglio dire e che non ti offendi.

    @roby492
    Quando definisco le gerarchie di classi di solito seguo una mia piccola regola: cosa serve alla classe più esterna per poter avere una consistenza logica?
    Individuati quei parametri, fissi dalla classe padre il costruttore (o meglio la sua signature) desiderato. Quelle sono le info minime che devo sempre fornire. Posso averne altre, nulla lo vieta, ma quello è il minimo indispensabile e non posso istanziare un oggetto di quel tipo senza specificare quelle informazioni.
    Le figlie devono rispettare la signature fissata, riproponendola e soprattutto chiamando il costruttore della classe padre come ti ha fatto vedere franksisca.
    Ricorda che puoi sempre definire costruttori con più parametri e anche con meno parametri, ricordando però di assegnare dei default per i parametri che non ti vengono forniti dal costruttore.
    Ricorda anche che la chiamata a super è la prima che deve essere fatta
    RTFM Read That F*** Manual!!!

  4. #4
    Originariamente inviato da valia
    una nota: so che per costruttore di copia tu intendi uno che partendo da una istanza di Libro ne crea un'altra, ma in il concetto di "costruttore di copia" è più del C++ che di Java e nella definizione di gerarchie di classi può confondere. Oltretutto trovo alquanto pericoloso mettere nel costruttore della classe padre un riferimento alla classe figlia (al max lo terrei della classe padre).
    In Java quello che a mio parere più si avvicina al concetto di costruttore di copia (inteso come colui che crea una copia dell'istanza corrente) è clone, spero di essermi spiegata su quello che voglio dire e che non ti offendi.
    infatti di solito si eredita il metodo clone della classe Object.

    nessuna offesa, anzi, più si impara e meglio è

    mi chiarisci meglio, s enon ti disturba, il concetto in grassetto per favore. anche perchè in fase di progettazione "idealmente" io non conosco le classi figlie, quindi non posso mettere riferimenti alle classi figlie. almeno così la penso...

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    esatto, hai capito bene.
    Tu in fase di progettazione non sai se mai avrai delle figlie e quali saranno, quindi se proprio vuoi "clonarti" in qualche modo metti un riferimento della classe padre. In quel caso il costruttore della classe padre partirà da un oggetto che di sicuro conosce, dello stesso tipo di se stesso per intenderci.
    Provo a chiarirmi con un esempio:

    Codice PHP:
    package sample;

    public class 
    TestoA extends Testo{
        
        private 
    String altroParametro "";

        public 
    TestoA(String autoreString titolo) {
            
    this(autoretitolo"");
        }

        public 
    TestoA(Testo testo) {
            
    this (testo.getAutore(), testo.getTitolo(), "");
            
        }
        
        public 
    TestoA(Testo testoString altroParametro) {
            
    this (testo.getAutore(), testo.getTitolo(), altroParametro);
            
        }
        
        public 
    TestoA(String autoreString titoloString altroParametro) {
            
    super(autoretitolo);
            
    this.altroParametro altroParametro
        }

        @
    Override
        
    public String toString() {
            return 
    "TestoA [altroParametro=" altroParametro ", getAutore()="
                    
    getAutore() + ", getTitolo()=" getTitolo() + "]";
        }

        public 
    String getAltroParametro() {
            return 
    altroParametro;
        }

        public 
    void setAltroParametro(String altroParametro) {
            
    this.altroParametro altroParametro;
        } 
        
    }

    package sample;

    public class 
    Testo {
        private 
    String autore;
        private 
    String titolo;
        
        public 
    Testo(String autoreString titolo) {
            
    this.autore autore;
            
    this.titolo titolo;
        }
        
        public 
    Testo(Testo testo) {
            
    this(testo.getAutore(), testo.getTitolo());
        }
        
        public 
    String getAutore() {
            return 
    autore;
        }
        public 
    void setAutore(String autore) {
            
    this.autore autore;
        }
        public 
    String getTitolo() {
            return 
    titolo;
        }
        public 
    void setTitolo(String titolo) {
            
    this.titolo titolo;
        }

        @
    Override
        
    public String toString() {
            return 
    "Testo [autore=" autore ", titolo=" titolo "]";
        }
    }

    package sample;

    public class 
    Esempio {

        
    /**
         * @param args
         */
        
    public static void main(String[] args) {
            
    Testo testo = new Testo("prova""titolo");
            
    System.out.println(testo);
            
    Testo testo1 = new Testo(testo); 
            
    System.out.println(testo1);
            
            
    TestoA testoa = new TestoA(testo"prendermi");
            
            
    System.out.println(testoa);
            
            
    TestoA testo3 = new TestoA(testoa"pluto");
            
            
    System.out.println(testo3);
        }


    e questo è l'output
    Testo [autore=prova, titolo=titolo]
    Testo [autore=prova, titolo=titolo]
    TestoA [altroParametro=prendermi, getAutore()=prova, getTitolo()=titolo]
    TestoA [altroParametro=pluto, getAutore()=prova, getTitolo()=titolo]

    ora ti commento
    RTFM Read That F*** Manual!!!

  6. #6
    non è necessario il commento, il codice è così lampante

    grazie per la delucidazione

  7. #7
    Ok grazie dei preziosi consigli. Io ho fatto così:

    codice:
    public class Testo 
    {
    	private String 	id;
    	private String editore;
    	private int pagine;
    	private String categoria;
    	
    	public Testo(String editore, int pagine, String categoria)
    	{
    		this.editore=editore;
    		this.pagine=pagine;
    		this.categoria=categoria;
    	}
    	public String getEditore()
    	{
    		return editore;
    	}
    	public int getPagine()
    	{
    		return pagine;
    	}
    	public String getCategoria()
    	{
    		return categoria;
    	}
    	public Testo(Testo testo) { 
            this(testo.getEditore(),testo.getPagine(),testo.getCategoria()); 
        } 
    }
    
    public class periodico extends Testo 
    {
    	public periodico(Testo testo, String nome, String genere, String settimana, String anno)
    	{
    		super(testo);
    		nome=nome;
    		genere=genere;
    		settimana=settimana;
    		anno=anno;
    	}
    }
    Mi chiedo perchè se inserisco entrambe le classi in un package, dichiarando package sample; all'inizio della classe, la classe figlia non vede quella padre/madre...?

    Grazie vi stimo veramente molto:-)

    Ciaoooo!

  8. #8
    attento che nello stesso file ci può stare 1 sola classe public

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    perché devi importare la classe, ad esempio mettendo

    codice:
    import sample.*;
    dopo la dichiarazione del package e prima della dichiarazione della classe
    RTFM Read That F*** Manual!!!

  10. #10
    @franksisca: il codice che vedi postato fa parte di due file diversi, li ho solo postati insieme :-)

    @valia: tu mi aiuti sempre, grazie :-)
    quindi la dichiarazione package ne sancisce l'appartenenza, ma non basta a far si che le varie classi del package si vedano tra loro.


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.