Ereditarietà

di il
7 risposte

Ereditarietà

Buonasera a tutti,
ho un dubbio riguardo l'ereditarietà.
Se ho una superclasse astratta e due sottoclassi ed istanzio un oggetto di una delle due sottoclassi. Supponendo che questo oggetto debba essere modificato(La modifica riguarda l'aggiunta di altri campi non cambiando quelli già esistenti.)
Se istanzio un oggetto dell'altra sottoclasse che contiene tutti i campi, che mi servono dopo la modifica, ho lo stesso oggetto con l'aggiunta di altri campi? Oppure ho completamente istanziato un altro oggetto? Mi serve perché un programma mi chiede di modificare un oggetto e passarlo da una lista all'altra. Quindi suppongo che l'oggetto non debba essere nuovamente istanziato ma solo modificato essendo che alcuni campi rimangono uguali. Non so se è corretto l'approccio utilizzando l'ereditarietà o se esiste un altro modo per fare questa cosa.

7 Risposte

  • Re: Ereditarietà

    ThisNamexxx ha scritto:


    Se ho una superclasse astratta e due sottoclassi ed istanzio un oggetto di una delle due sottoclassi. Supponendo che questo oggetto debba essere modificato(La modifica riguarda l'aggiunta di altri campi non cambiando quelli già esistenti.)
    Se istanzio un oggetto dell'altra sottoclasse che contiene tutti i campi, che mi servono dopo la modifica, ho lo stesso oggetto con l'aggiunta di altri campi? Oppure ho completamente istanziato un altro oggetto? Mi serve perché un programma mi chiede di modificare un oggetto e passarlo da una lista all'altra. Quindi suppongo che l'oggetto non debba essere nuovamente istanziato ma solo modificato essendo che alcuni campi rimangono uguali. Non so se è corretto l'approccio utilizzando l'ereditarietà o se esiste un altro modo per fare questa cosa.
    Non è molto chiaro ... più che altro perché continui a parlare di "modificare un oggetto". Un conto è un oggetto "mutabile", la cui classe offre metodi es. setQualcosa o qualunque altro metodo per modificare lo "stato" (=variabili di istanza) dell'oggetto.
    E un altro conto è la ereditarietà.

    Se si fa es.
    public abstract class A {
        private int val1;
    
        public void setVal1(int val1) {
            this.val1 = val1;
        }
    }
    
    public class B extends A {
        private int val2;
    
        public void setVal2(int val2) {
            this.val2 = val2;
        }
    }
    La classe B estende A. Quando crei un oggetto di tipo B ( new B() ), all'interno dell'oggetto ci sono DUE variabili di istanza: val1 e val2. Questo è scontato, indipendentemente dal livello di accesso di quelle variabili di istanza.

    Ma la classe B NON "eredita" il campo val1 da A. In Java "ereditare" membri da una super-classe è più una questione di "visibilità" di questi membri. Per la classe B il campo val1 semplicemente "non esiste". Ma nell'oggetto C'È.

    (p.s. il fatto che nell'esempio A è abstract non conta/cambia nulla)
  • Re: Ereditarietà

    Infatti secondo me non si tratta di oggetto mutabile, ma forse nemmeno di ereditarietà dato che il campo non viene ereditato.
    Il programma deve prelevare un oggetto da una coda, aggiornare i dati relativi all'oggetto( intende l'aggiunta di altri campi, oltre a quelli già esistenti ed inizializzati) e salvare l'oggetto in una lista. Per esempio se un oggetto è identificato con il numero 3 nella coda, una volta prelevato l'oggetto e aggiornati i dati e quindi aggiunti altri campi l'oggetto deve essere identificato sempre dal numero 3. Come potrei proseguire in questo caso?
  • Re: Ereditarietà

    Non è molto chiaro ... più che altro perché continui a parlare di "modificare un oggetto". Un conto è un oggetto "mutabile", la cui classe offre metodi es. setQualcosa o qualunque altro metodo per modificare lo "stato" (=variabili di istanza) dell'oggetto.
    E un altro conto è la ereditarietà.

    Se si fa es.
    public abstract class A {
        private int val1;
    
        public void setVal1(int val1) {
            this.val1 = val1;
        }
    }
    
    public class B extends A {
        private int val2;
    
        public void setVal2(int val2) {
            this.val2 = val2;
        }
    }
    La classe B estende A. Quando crei un oggetto di tipo B ( new B() ), all'interno dell'oggetto ci sono DUE variabili di istanza: val1 e val2. Questo è scontato, indipendentemente dal livello di accesso di quelle variabili di istanza.

    Ma la classe B NON "eredita" il campo val1 da A. In Java "ereditare" membri da una super-classe è più una questione di "visibilità" di questi membri. Per la classe B il campo val1 semplicemente "non esiste". Ma nell'oggetto C'È.

    (p.s. il fatto che nell'esempio A è abstract non conta/cambia nulla)
    Infatti secondo me non si tratta di oggetto mutabile, ma forse nemmeno di ereditarietà dato che il campo non viene ereditato.
    Il programma deve prelevare un oggetto da una coda, aggiornare i dati relativi all'oggetto( intende l'aggiunta di altri campi, oltre a quelli già esistenti ed inizializzati) e salvare l'oggetto in una lista. Per esempio se un oggetto è identificato con il numero 3 nella coda, una volta prelevato l'oggetto e aggiornati i dati e quindi aggiunti altri campi l'oggetto deve essere identificato sempre dal numero 3. Come potrei proseguire in questo caso?
  • Re: Ereditarietà

    ThisNamexxx ha scritto:


    intende l'aggiunta di altri campi, oltre a quelli già esistenti ed inizializzati
    Non esiste e non è possibile "creare" nuovi campi (variabili di istanza) in un oggetto. La "forma" di un oggetto è solo definita staticamente dalla classe dell'oggetto (e super-tipi).

    Devi chiarire (e chiarirti le idee). Se hai un oggetto di tipo X e vuoi riversare i suoi dati in un oggetto di classe Y (differente) che ha gli stessi campi PIÙ altri aggiuntivi, sì certo è assolutamente fattibile (e anzi, nemmeno strano ma abbastanza frequente).

    Se intendi altro .. chiarisci.
  • Re: Ereditarietà

    Se hai un oggetto di tipo X e vuoi riversare i suoi dati in un oggetto di classe Y (differente) che ha gli stessi campi PIÙ altri aggiuntivi, sì certo è assolutamente fattibile (e anzi, nemmeno strano ma abbastanza frequente).
    si esatto probabilmente ho espresso male il concetto ma intendevo questo. In questo caso come si procede?
  • Re: Ereditarietà

    ThisNamexxx ha scritto:


    si esatto probabilmente ho espresso male il concetto ma intendevo questo. In questo caso come si procede?
    Hai un oggetto X. Istanzi un oggetto Y e "copi" i dati da uno all'altro (tramite metodi getter/setter, possibilmente NON mettendo i campi pubblici!) poi imposti altro in più in Y.
  • Re: Ereditarietà

    Già che ci sono (anche se l'ora è tarda) volevo darti un breve chiarimento anche sul fatto che l'ereditarietà può c'entrare ma nel seguente modo.

    Prendiamo un caso semplice e comprensibile: una classe Persona e una Studente. Qui la ereditarietà HA senso: uno studente è una persona. Quindi se studente ha solo la matricola in più rispetto alla persona, le due classi si possono scrivere così:
    public class Persona {
        private String nome;
        private String cognome;
    
        // metodi pubblici getter/setter per nome/cognome (più altro eventuale)
    }
    
    public class Studente extends Persona {
        private String matricola;
    
        // metodi pubblici getter/setter per matricola (più altro eventuale)
    }
    Un altro caso diverso: Punto2D e Punto3D. Qui la ereditarietà NON ha senso. Un Punto3D NON è un "caso particolare" di Punto2D ... è proprio un'altra cosa! Quindi:
    public class Punto2D {
        private double x;
        private double y;
    
        // metodi pubblici getter/setter per x/y (più altro eventuale)
    }
    
    public class Punto3D {
        private double x;
        private double y;
        private double z;
    
        // metodi pubblici getter/setter per x/y/z (più altro eventuale)
    }
    Nel primo caso Persona/Studente, Studente estende Persona e permette quindi di: a) avere già nell'oggetto Studente i campi nome/cognome, b) ereditare i membri accessibili (non quelli private).
    Ma resta comunque il fatto che in entrambi i casi se vuoi riversare i dati da un oggetto all'altro dovresti poi fare:
    Persona persona1 = .......
    Studente studente1 = new Studente();
    studente1.setNome(persona1.getNome());
    studente1.setCognome(persona1.getCognome());
    studente1.setMatricola("1234");    // in più rispetto a Persona
    
    Punto2D p2d = ......
    Punto3D p3d = new Punto3D();
    p3d.setX(p2d.getX());
    p3d.setY(p2d.getY());
    p3d.setZ(0);     // in più rispetto a Punto2D, per esempio lo fissiamo a 0 sul piano z
Devi accedere o registrarti per scrivere nel forum
7 risposte