Originariamente inviato da _SC_
non capisco il senso però.
Tu dici :
ho un riferimento figura.
gli passo un triangolo.
Ho sempre una figura oppure ho un triangolo?
Ovviamente il tipo specifico è sempre quello istanziato, quindi hai un Triangolo (solo che lo vedi attraverso un riferimento a Figura).
Ma al di là di questo... fa qualche differenza? Un triangolo è una figura. Se ho un triangolo, automaticamente ho anche una figura.
Se faccio un getClasse ottengo un triangolo. Però non posso usare i metodi triangolo ma solo quelli di figura.
Esatto, perchè stai usando un riferimento di tipo Figura.
allora qual'è il senso di permettere questo assegnamento, a livello pratico??
Se penso di avere un triangolo e cerco di usarlo come un triangolo non ci riesco..
Questo è il brutto delle guide/manuali/corsi. Non c'è nessuno che faccia un esempio chiaro e utile. Quel tipo di scrittura non lo userai mai perchè è perfettamente inutile.
Supponi di dover scrivere una classe che inserisce dentro ad un file le aree di diverse figure. Questa classe avrà un metodo che riceve la figura e salva nel file l'area calcolata di quella figura. Hai due possibilità:
1) Scrivere una classe con un metodo per ciascun tipo di figura. Quindi, un metodo che riceve un Triangolo, un metodo che riceve un Quadrato, un metodo che riceve un Cerchio, ...
2) Scrivere una classe con un solo metodo che riceve un oggetto Figura.
La soluzione 1 è dispendiosa oltre ogni immaginazione e non è nemmeno scalabile. Se domani io mi invento un particolare tipo di figura, non ho un metodo di quella classe pronto a ricevere il mio oggetto e sono fregato.
La soluzione 2 è la normalità: me ne frego di quale tipo specifico di Figura mi abbiano passato... io ne uso il metodo getArea() (che è della classe Figura e che ciascuna figura ha ridefinito opportunamente con la propria formuletta).
codice:
public void salvaAreaNelFile(Figura f) {
// Non mi interessa sapere che tipo di figura...
// Può essere un Triangolo, un Quadrato, un Cerchio o un Trapezio
// ma essendo un oggetto Figura, sicuramente ha il metodo getArea()
Double area = f.getArea();
... // Salvo l'area nel file
}
...
Triangolo t = new Triangolo();
Cerchio c = new Cerchio();
Rettangolo r = new Rettangolo();
salvaAreaNelFile( t );
salvaAreaNelFile( c );
salvaAreaNelFile( r );
Questo grazie all'ereditarietà: se facessi il getClass() di quell'oggetto "f" dentro al metodo mi verrebbe restituita la classe esatta dell'oggetto passato, ma a me non interessa nulla.
E ho invocato sempre lo stesso metodo, passandogli di volta in volta l'oggetto desiderato.
Ciao.