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.