classi astratte
TRANSCRIPT
LEZIONE SUL POLIMORFISMO DEL PROF. SILVANO NATALIZI
PER LA CLASSE IV A LICEO TECNICONOVEMBRE 2008
polimorfismo
Questa struttura non è poi così maleQuesta struttura non è poi così male
L’abbiamo disegnata per minimizzare il codice duplicatoL’abbiamo disegnata per minimizzare il codice duplicato
Possiamo disegnare i programmi con parametri di tipo Animale, cosicchè ogni sottotipo di animale, anche quelli che non abbiamo ancora immaginato, possano essere passati e usati nei metodi e negli array
Ci siamo dimenticati di qualcosa ?
Un riferimento v di tipo Volpe punta ad un oggetto di tipo Volpe
Cosa succede quando instanziamo un Animale?
Un riferimento ippo di tipo Animale punta ad un oggetto di tipo Ippopotamo
Cosa succede quando instanziamo un Animale
Un riferimento anim di tipo Animale punta ad un oggetto di tipo Animale
Cosa succede quando instanziamo un animale?
A chi assomiglia un oggetto di tipo Animale ?A chi assomiglia un oggetto di tipo Animale ?
Paura
Ha senso instanziare la classe Animale?
Alcune classi non dovrebbero essere instanziate !!
Ha certamente senso creare un oggetto volpe, tigre, ippopotamo, ma che cosa esattamente è un oggetto animale ? Quale è la sua forma ? Il suo colore ? La sua dimensione ? Quante gambe ha ?
Ci serve la classe Animale
Ci serve per l’ereditarietà e per il polimorfismo
Però vogliamo che i programmatori possano instanziare solamente le meno astratte sottoclassi della classe Animale
Non vogliamo oggetti Animale, ma quelli leone, volpe…
Classe astratta
Per prevenire l’istanziazione di una classePer impedire che che qualcuno usi “new” di
quel tipoSi marca la classe come abstract.Marcandola abstract, il compilatore blocca
quel codice dal creare un’istanza di quel tipo.
Classe concreta
Quando si disegna una struttura di ereditarietà, occorre decidere quali classi sono astratte e quali concrete
La classe concreta è quella che è specifica abbastanza da essere instanziata
Una classe concreta è ok per produrre oggetti del suo tipo.
Per fare una classe astratta
Per fare una classe astratta basta mettere la parola abstract prima della dichiarazione di classe
abstract class Canina extends Animale { Public void muoversi() { }
}
Riferimento ad un oggetto
Si può usare un tipo astratto come variabile di riferimento (per usarlo come argomento polimorfico e tipo di return, o per fare un array polimorfico )
Il compilatore impedisce l’instanziazione di una classe astratta
Questo è ok perché si può assegnare un oggetto di una sottoclasse ad un riferimento di superclasse, anche quando questa è astratta
La classe Canina è marcata come astratta, per cui il compilatore non permette di fare questo !
Classi concrete e astratte
Nell’albero ereditario di Animale facciamo astratte le classi Animale, Felina, Canina
Componenti grafici di java
In java si trovano innumerevoli classi astratte, in particolare nella libreria GUI. Dalla super classe Component si ricavano bottoni, aree di testo, barre di scorrimento, finestre di dialogo …
Voi mai fate un’istanza di un componente generico e lo mettete su di uno schermo, ma disegnate un bottone, un’area di testo ed altri componenti grafici concreti
In altre parole, instanziate solo una sottoclasse concreta di un Componente, ma mail il componente generico !
Metodo astratto
Oltre alla classi, potete marcare anche un metodo come astratto !
Una classe astratta significa che la classe deve essere estesa
Un metodo astratto significa che quel metodo deve essere sovrascritto (overriden).
Potete decidere che alcuni o tutti i comportamenti di una classe astratta non hanno significato a meno che non siano implementati da una sottoclasse più specifica.
Un metodo astratto non ha corpo
Come fare un metodo astratto
public abstract void mangiare() ;
Non cè il corpo del metodo racchiuso tra
parentesi graffe !La dichiarazione del
metodo astratto termina con un punto
e virgola
Metodo astratto in classe astratta
Se dichiarate un metodo astratto, dovete marcare la classe come astratta.
Non si può avere un metodo astratto in una classe concreta. Anche se mettete un solo metodo astratto in una
classe, questa deve essere astratta. Potete mescolare sia metodi astratti che metodi
concreti in una classe astratta.
Perché avere metodi astratti ?