classi astratte
TRANSCRIPT
![Page 1: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/1.jpg)
LEZIONE SUL POLIMORFISMO DEL PROF. SILVANO NATALIZI
PER LA CLASSE IV A LICEO TECNICONOVEMBRE 2008
polimorfismo
![Page 2: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/2.jpg)
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 ?
![Page 3: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/3.jpg)
Un riferimento v di tipo Volpe punta ad un oggetto di tipo Volpe
Cosa succede quando instanziamo un Animale?
![Page 4: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/4.jpg)
Un riferimento ippo di tipo Animale punta ad un oggetto di tipo Ippopotamo
Cosa succede quando instanziamo un Animale
![Page 5: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/5.jpg)
Un riferimento anim di tipo Animale punta ad un oggetto di tipo Animale
Cosa succede quando instanziamo un animale?
![Page 6: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/6.jpg)
A chi assomiglia un oggetto di tipo Animale ?A chi assomiglia un oggetto di tipo Animale ?
Paura
![Page 7: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/7.jpg)
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 ?
![Page 8: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/8.jpg)
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…
![Page 9: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/9.jpg)
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.
![Page 10: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/10.jpg)
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.
![Page 11: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/11.jpg)
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() { }
}
![Page 12: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/12.jpg)
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 )
![Page 13: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/13.jpg)
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 !
![Page 14: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/14.jpg)
Classi concrete e astratte
Nell’albero ereditario di Animale facciamo astratte le classi Animale, Felina, Canina
![Page 15: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/15.jpg)
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 !
![Page 16: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/16.jpg)
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.
![Page 17: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/17.jpg)
Un metodo astratto non ha corpo
![Page 18: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/18.jpg)
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
![Page 19: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/19.jpg)
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.
![Page 20: Classi Astratte](https://reader036.vdocuments.net/reader036/viewer/2022062313/558e999a1a28ab8c708b470b/html5/thumbnails/20.jpg)
Perché avere metodi astratti ?