Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2001
    Messaggi
    16

    Java Domanda su classi e eredità

    Ho un dubbio...........
    Ho due classi :Padre e Figlio
    Figlio eredita tutti i metodi da quella padre.

    E' possibile fare questo:
    Figlio p = new Padre();

    Cioè instanziare solo la classe che Padre.......da quella figlia(e soprattutto cosa mi serve?)

    Ps: Sono un po' digiuno di programmazione ad oggetti.........

    Help Me.........
    Fausto.......

  2. #2
    hmmm si credo si possa fare ma non ti serve a + di tanto... di solito si fa il contrario.

    esempio : su un array di Elettrodomestici

    Elettrodomestico[] el = new Elettrodomestico[2];

    puoi specializzare ogni elemento dell'array come preferisci:

    el[0] = new Aspirapolvere();
    el[1] = new Friggitrice();

    Ovviamente Aspirapolvere e Friggitrice estendono da Elettrodomestico...

    scusa l'esempio poco felice ma è l'unica cosa che mi viene in mente di lunedi' mattina!

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    E' possibile fare questo:
    Figlio p = new Padre();
    No, non e' una cosa possibile (e non ha nemmeno molto senso, secondo me), perche' la classe figlio e' piu' specializzata di padre, quindi puo' contenere membri non presenti in Padre.
    Non importa che tu, nel momento in cui programmi, ti assicuri che cio' non avvenga, il linguaggio non ti puo' permettere una cosa simile, sarebbe un grosso errore.
    E' comunque possibile il contrario, cioe' istanziare la classe Padre, a partire dal figlio:

    Padre p = new Figlio();

    in tal caso p fara' riferimento solo ai membri utilizzabili nella definizione di Padre, tuttavia, essi punteranno, effettivamente, a quelli dichiarati in Figlio.
    Ciao,
    Lorenzo

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2001
    Messaggi
    16

    .........a ok

    Si effetivamente avevo le idee confuse..........

    ma che vantaggi ti porta istanziare la classe Padre, a partire dal figlio?

    E' uguale a istanziare direttamente il padre da un oggetto padre?

    Grazie.........
    Fausto.......

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    No, non e' uguale, se nella classe figlio ridefinisci qualcosa (sia vadiabili che metodi) l'oggetto p cosi' istanziato

    Padre p = new Figlio();

    Fa riferimento ai metodi e alle variabili della classe Figlio.
    Tuttavia se la classe Figlio aggiunge dei membri, questi non saranno visibili all'oggetto p, ma potranno diventarlo nel caso di un casting esplicito:

    Padre p = new Figlio();
    Figlio n = (Figlio)p;

    In questo esempio p puo' accedere ai metodi e alle variabili di Figlio che sono dichiarate in Padre, mentre n puo' accedere a tutti i membri di Figlio, indistintamente.

    Quanto all'utilita' non ti saprei dire, ma e' una cosa da usare con parsimonia, per due motivi:
    1) Come ti ho detto anche se dichiari p Padre, ma lo istanzi come figlio, e' un oggetto di tipo figlio ad essere istanziato (quindi con probabile aumento di consumo di memoria)
    2) Comunque utilizzi i metodi di figlio, nel caso essi siano ridefiniti rispetto alla classe Padre, questo potrebbe non essere il comportamento di cui hai bisogno.
    Ciao,
    Lorenzo

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2001
    Messaggi
    16

    .........

    Grazie mille ora ho capito........

    Ultima cosa.........se Padre è una classe astratta.....?

    Secondo me il programma va in errore........Giusto....?


    Cmq se hai dei link sul argomento me li puoi passare, x' su queste cose devo preparare un esame..........

    Cmq grazie Mille.....
    Fausto.......

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    Se Padre e' una classe astratta non e' direttamente istanziabile, ma se Figlio ne ridefinisce tutti i metodi astratti puoi istanziare Figlio, chiaramente.

    Per tornare al discorso di prima, un valido utilizzo pratico di questa tecnica puo' essere il passaggio di argomenti ad un metodo. Se, ad esempio tu scrivi una classe che deve maneggiare un certo tipo di oggetti, ma vuoi lasciare ad altri la possibilita' di personalizzare gli oggetti, scrivi una classe astratta che stabilisce cio' di cui tu hai bisogno, e utilizzi quella classe per passare l'oggetto come argomento.
    codice:
    public class Figlio extends Padre }
      public void metodoInterno() {
        //qui fornisci una implementazione del metodo astratto
      }
    }
    
    public class Main {
      public void metodo1(Padre p) {
       p.metodoInterno();
      }
      .
      .
      //nella classe principale puoi fare cosi'
      Figlio f = new Figlio();
      metodo1(f);
      .
    }
    Come vedi metodo1 accetta come parametro un oggetto Padre, una classe astratta definita da te, per assicurarti che in essa esista un metodo chiamato metodoInterno()
    Il compito di fornire un'implementazione per quel metodo spetta a un altro programmatore, che scrive una nuova classe, la quale estende Padre, In questo caso un oggetto figlio puo' essere passato come argomento a metodo1().

    Spero di essere stato abbastanza chiaro. Non saprei che link darti, io di solito faccio le ricerche nei siti delle universita', in cui si posso no trovare le lezioni on-line (a volte).
    Comunque un modo molto efficace per imparare e' provare a fare questi esempi e far stampare una stringa a video dentro ogni costruttore, e dentro ogni metodo, cosi' puoi vedere che parti di codice vengono eseguite.
    Ciao,
    Lorenzo

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2001
    Messaggi
    16
    Grazie mille ora ci sono.........
    Fausto.......

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 © 2024 vBulletin Solutions, Inc. All rights reserved.