Pega ha scritto:
Mi è capitato spesso di vedere scritto:
Animale Furia = new Cavallo();
Dove animale è appunto il nome della classe astratta, e mi chiedevo se fosse differente scriverlo come:
Cavallo Furia = new Cavallo();
Questo è il mio dubbio...
Mi sembra di aver capito che non cambia nulla pero'.
Dal punto della istanziazione no, non cambia nulla. Ma assegnare ad una variabile Cavallo invece che al supertipo Animale, ovviamente cambia ... cambia cioè il livello di "astrazione" che si vuole usare.
Ma dipende poi da COSA devi fare poi su quel
Furia. Se hai bisogno di usare metodi specifici di Cavallo (che non ci sono in Animale), ovviamente devi avere la variabile di tipo Cavallo. Altrimenti potresti stare un po' più sul generico assegnando ad un Animale.
E' un po' la stessa cosa di quando si tiene una variabile di istanza come List<Qualcosa> invece che ArrayList<Qualcosa>. Perché? Perché generalmente è preferibile stare più sul generico, così può funzionare con implementazioni diverse di List.
Generalmente se si riesce a generalizzare le cose, meglio è.
Nel caso di una variabile locale come il tuo esempio, molto probabilmente potrebbe non fare granché differenza. La vera differenza è quando fai un metodo che ha come parametro Animale e non un tipo più specifico. Perché magari il metodo deve poter operare su "qualunque" animale in maniera generalizzata.