Oggetto diverso dal riferimento

di il
6 risposte

Oggetto diverso dal riferimento

Salve a tutti,
mi potete spiegare l'utilità della seguente istruzione.
Animal b = new Dog();   // Animal reference but Dog object
Animal è la classe padre e Dog classe figlio.
Qual è l'utilità di chiamare il costruttore della classe figlio (quindi istanziarla) e definire l'oggetto di tipo classe padre??

6 Risposte

  • Re: Oggetto diverso dal riferimento

    rob* ha scritto:


    mi potete spiegare l'utilità della seguente istruzione.
    Animal b = new Dog();   // Animal reference but Dog object
    Animal è la classe padre e Dog classe figlio.
    Qual è l'utilità di chiamare il costruttore della classe figlio (quindi istanziarla) e definire l'oggetto di tipo classe padre??
    Innanzitutto è possibile/probabile che Animal sia più sensata come classe astratta, quindi in tal caso non sarebbe ovviamente istanziabile.
    Ma la risposta comunque è semplice: uso del polimorfismo.

    Probabilmente quella riga, da sola e/o a seconda di come viene usata potrebbe non essere molto importante che la variabile sia del tipo più generico. Ma immagina se un metodo avesse come parametro un Animal, puoi passare lecitamente qualunque implementazione. E questo perché al metodo sicuramente non interessa quale è l'oggetto reale ma solo che "funzioni" da animale. Se Animal ha un emettiVerso() e in Dog viene ridefinito per fare qualcosa di più specifico, se il metodo che riceve il Animal ci invoca emettiVerso(), la implementazione invocata sarà quella "giusta" ovvero quella implementata in Dog. Questo è il polimorfismo.
  • Re: Oggetto diverso dal riferimento

    
    ...
    Animal il_mio_animale_di_compagnia = new Dog("Fido");
    Animal il_tuo_animale_di_compagnia = new Cat("Micio");
    
    il_mio_animale_di_compagnia.speak();
    il_tuo_animale_di_compagnia.speak();
    
    List<Animal > animali_di_compagnia = new ArrayList<Animal >();
    animali_di_compagnia.add(il_mio_animale_di_compagnia);
    animali_di_compagnia.add(il_tuo_animale_di_compagnia);
    
    for(Animal pet : animali_di_compagnia)
        pet.speak();
    
    ...
    
  • Re: Oggetto diverso dal riferimento

    La riga di codice l'ho presa dalla guida del seguente link:




    Non capisco perchè l'output del secondo esempio dia errore....
  • Re: Oggetto diverso dal riferimento

    rob* ha scritto:


    Non capisco perchè l'output del secondo esempio dia errore....
    Infatti è corretto che quel secondo esempio dia errore di compilazione. Il bark() è definito e noto solo in Dog ... NON in Animal. Quindi b.bark(); con b di tipo Animal è un ERRORE di compilazione. Su un reference di tipo Animal puoi invocare solo ciò che è noto ad Animal. Non puoi "vedere" bark() anche se l'oggetto realmente istanziato (Dog) ce l'ha.
  • Re: Oggetto diverso dal riferimento

    Ma allora perchè non scrivere semplicemente: Dog b = new Dog (); ??
  • Re: Oggetto diverso dal riferimento

    rob* ha scritto:


    Ma allora perchè non scrivere semplicemente: Dog b = new Dog (); ??
    Infatti DEVI avere un reference di tipo Dog per poter invocare bark().
Devi accedere o registrarti per scrivere nel forum
6 risposte