CORSO DI PROGRAMMAZIONE

Documenti analoghi
CORSO DI PROGRAMMAZIONE

CORSO DI PROGRAMMAZIONE

CORSO DI PROGRAMMAZIONE

CORSO DI PROGRAMMAZIONE

CORSO DI PROGRAMMAZIONE

CORSO DI PROGRAMMAZIONE

CORSO DI PROGRAMMAZIONE

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali

METODI ESERCIZI. 07-xx_Esercizi[01] Versione del: venerdì 3 maggio Andrea Zoccheddu CORSO INFORMATICA ITI ANGIOY SASSARI

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

La classe java.lang.object

Informatica Ereditarietà Java. Ereditarietà

Programmazione Orientata agli Oggetti

CORSO DI PROGRAMMAZIONE

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

CORSO DI PROGRAMMAZIONE

CORSO DI PROGRAMMAZIONE

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Programmazione con Java

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Paradigmi della PO. Incapsulamento. Ereditarietà. Polimorfismo. Software per TLC - AA 2008/2009 1

Definizione di classi. Walter Didimo

Esempi in Java di program.ne O-O

Subtype Polymorphism. Conversioni di tipo. Conversioni di tipo. Subtyping. Conversioni di tipo. Interfacce e subtype polimorfismo

PROGETTAZIONE DI DATABASE

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Ereditarietà e Polimorfismo. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Uguaglianza e copia di oggetti

CORSO DI PROGRAMMAZIONE

La programmazione ad oggetti (OOP)

18 - Classi parzialmente definite: Classi Astratte e Interfacce

INTRODUZIONE ALLA PROGRAMMAZIONE

Programmazione Java Avanzata Programmazione Object- Oriented in Java

Fondamenti di Informatica T-1. Costruttori Ereditarietà

CORSO DI PROGRAMMAZIONE

Laboratorio di Sistemi Polimorfismo Java. Prerequisiti: per la comprensione dell'articolo è necessario conoscere il concetto di Ereditarietà in Java.

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Le basi del linguaggio Java

Laboratorio di Programmazione 1 [Java]

16 - Ereditarietà, tipi e gerarchie

16 - Ereditarietà, tipi e gerarchie

Uso di metodi statici. Walter Didimo

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Fondamenti di Informatica T-1. Ereditarietà & Polimorfismo

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Ereditarietà e Polimorfismo

CORSO DI PROGRAMMAZIONE

Indice. Prefazione. 3 Oggetti e Java 53

CORSO DI PROGRAMMAZIONE

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006

Catia Trubiani. Laboratorio di Ingegneria del Software a.a

Dall analisi alla codifica (1)

Esempio: Costruttori ed ereditarietà

La Gestione della Memoria. Carla Binucci e Walter Didimo

Ereditarietà e polimorfismo

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Programmazione ad oggetti

Definizione di classi

Funzioni, Stack e Visibilità delle Variabili in C

Obiettivi. Comprendere i vantaggi offerti dal meccanismo dell ereditarietà Attivare processi di astrazione e specializzazione.

Proprietà delle Classi e degli Oggetti in Java

L ereditarieta` Riuso del software: Ereditarieta`, Composizione, Polimorfismo e Binding Dinamico Ereditarietà Ereditarietà

Informatica 3. Informatica 3. LEZIONE 8: Fondamenti di programmazione orientata agli oggetti (2) Lezione 8 - Modulo 1

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà

Lettura e scrittura di file di dati input/output

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Esercitazione n 2. Obiettivi

CORSO DI PROGRAMMAZIONE

Proprietà delle Classi e degli Oggetti in Java

Corso di Informatica

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Riassunto. La programmazione OO. Oggi. Esempio

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Informatica 3. LEZIONE 8: Fondamenti di programmazione orientata agli oggetti (2)

Funzioni. Unità 1. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Fondamenti di informatica T-1 (A K) Esercitazione 2: Linguaggio Java, basi e controllo del flusso

Modulo 2: Strutture fondamentali della programmazione Java

Fondamenti di Informatica I

Laboratorio di programmazione

Java Virtual Machine. Indipendenza di java dalla macchina ospite. I threads in Java

Perché il linguaggio C?

Risoluzione dei metodi

Esempio 2: Subtyping

Programmazione II Compitino (Vers. B)

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

ESERCIZIO 1 (STRINGHE)

Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.

Calcolare x n = x x x (n volte)

Corso di Fondamenti di Informatica

CORSO DI PROGRAMMAZIONE

Introduzione alla programmazione Object Oriented. Luca Lista

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

Lezione 10 programmazione in Java. Anteprima. Programmazione OO. La programmazione orientata agli Oggetti. Javadoc. Esercizi

Algoritmo. La programmazione. Algoritmo. Programmare. Procedimento di risoluzione di un problema

Transcript:

ISTITUTO TECNICO INDUSTRIALE G. M. ANGIOY SASSARI CORSO DI PROGRAMMAZIONE POLIMORFISMO E CLASSI POLIMORFICHE DISPENSA 15.05 15-05_OOP_Polimorfismo_[06] Questa dispensa è rilasciata sotto la licenza Creative Common CC BY-NC-SA. Chiunque può copiare, distribuire, modificare, creare opere derivate dall'originale, ma non a scopi commerciali, a condizione che venga riconosciuta la paternità dell'opera all'autore e che alla nuova opera vengano attribuite le stesse licenze dell'originale. Versione del: 07/11/2015 Revisione numero: 15 Prof. Andrea Zoccheddu Dipartimento di Informatica DIPARTIMENTO INFORMATICA E TELECOMUNICAZIONI

DISPENSA 15-05_OOP_POLIMORFISMO_[06] PAG. 2 P O L I M O R F I S M O D E L L E C L A S S I INTRODUZIONE AL POLIMORFISMO UN EFFETTO COLLATERALE LIMITI DEI METODI Consideriamo un esempio concreto. public class Mostro public void Verso () MessageBox.Show("grugnito"); public class Mannaro : Mostro public void Verso () MessageBox.Show("ululato"); Mostro m = new Mostro (); m.verso(); Mannaro u = new Mannaro (); u.verso(); Nell esempio proposto qui sopra (che è possibile provare al PC con Visual Studio) un istanza di Mostro grugnisce, mentre un istanza di Mannaro ulula; e si vede con le finestre di dialogo! Tuttavia consideriamo di avere a disposizione una collezione (un vettore) di mostri da gestire per un orda in un videogioco, come questa: Mostro [ ] avversari = new Mostro [100]; // 100 mostri avversari E supponiamo di generare casualmente i mostri da creare in una zona del videogioco: Random cauale = new Random(); for (int i = 0; i<100; i++) if ( casuale.next (2) == 0 ) avversari [i] = new Mostro (); else avversari [i] = new Mannaro (); Come si vede nell algoritmo precedente, il vettore è riempito casualmente di Mostri generici e di Mannari. Questa possibilità è garantita dal meccanismo dell ereditarietà. Questo meccanismo consente di invocare il metodo dei vari mostri direttamente dalle celle del vettore: for (int i = 0; i<100; i++) avversari[i].verso (); questa invocazione è ammessa poiché il metodo Verso è previsto; tuttavia il funzionamento produce una qualche sorpresa (spero): tutti i Mostri grugniscono! Persino i Mannari! In effetti le invocazioni del metodo Verso( ) si riferiscono tutte al metodo implementato nella classe Mostro; infatti sebbene le istanze siano create con diversi costruttori il metodo invocato è legato dal compilatore in

DISPENSA 15-05_OOP_POLIMORFISMO_[06] PAG. 3 base alla dichiarazione del vettore. In altre parole, poiché le celle del vettore avversari sono tutte di tipo Mostro, il compilatore che deve verificare quale metodo di Mostro esista per le invocazioni legate alle celle e deve legare la chiamata in modo definitivo (a tempo di compilazione). Se poi l istanza effettiva fosse di tipo discendente (nel nostro caso di tipo Mannaro) questo non importa, poiché il compilatore ha già deciso, prima che il programma sia eseguito, quale sarà il metodo da attuare. Occorrerebbe che il compilatore rimandasse a tempo di esecuzione la decisione di quale metodo invocare; sarebbe utile cioè che durante l esecuzione il programma controlli il tipo effettivo dell istanza associata alla variabile e quindi decida quale metodo invocare run-time. METODI VIRTUALI LA PAROLA CHIAVE VIRTUAL Per dichiarare un metodo con un riferimento ritardato, Visual Studio dispone della parola riservata virtual, che induce il compilatore a rimandare la verifica delle invocazioni (sebbene ovviamente il compilatore debba verificare che il nome del metodo esista). La parola chiave virtual può essere indifferentemente usata prima o dopo public e static. LA PAROLA CHIAVE OVERRIDE Le classi discendenti tuttavia devono ridefinire il metodo usando la parola chiave override, che significa scavalcamento. In effetti il metodo della classe derivata scavalca (anticipa) il metodo più generale e viene invocato al suo posto. La parola chiave override può essere indifferentemente usata prima o dopo public e static. ESEMPIO DI METODI VIRTUALI Rifacendoci all esempio precedente, il metodo andrebbe definito così: public class Mostro public virtual void Verso () MessageBox.Show("grugnito"); public class Mannaro : Mostro public override void Verso () MessageBox.Show("ululato"); Mostro m = new Mostro (); m.verso(); Mannaro u = new Mannaro (); u.verso(); A questo punto la creazione casuale dei Mostri può essere lasciata identica a prima, ma quando si utilizza l invocazione essa è solo apparentemente uguale alla precedente: for (int i = 0; i<100; i++) avversari[i].verso (); in realtà il compilatore non lega subito la chiamata al metodo Verso ma la differisce e rimanda al tempo di esecuzione la scelta del metodo da invocare. L esecuzione produrrà casualmente grugniti e ululati!

DISPENSA 15-05_OOP_POLIMORFISMO_[06] PAG. 4 RIFERIMENTO RITARDATO Per comprendere il meccanismo dei metodi virtuali è importante capire la differenza tra tempo di compilazione e tempo di esecuzione. La compilazione è il momento in cui il programma viene analizzato sintatticamente e tradotto in un codice eseguibile; le invocazioni di metodi, le risoluzioni dei nomi, sono risolte in questo momento. Il compilatore controlla che il programma sia scritto correttamente, ottimizza le istruzioni, e predispone tutto per l esecuzione; ma non lo esegue. Quando il compilatore ha terminato, il programma non è stato ancora eseguito e quindi non ha lavorato. Quando il programma viene eseguito, si esegue in realtà il codice eseguibile restituito dal compilatore e non il codice sorgente (quello scritto dall umano). Alcune istruzioni producono un effetto diverso da quanto ci si aspettava inizialmente, poiché ci sono dati letti dall esterno o generati casualmente, che possono alterare l esecuzione. In generale, le chiamate ai metodi sono risolte a tempo di compilazione. Nel caso dei metodi virtuali tuttavia questo riferimento è ritardato e si rimanda al tempo di esecuzione il controllo del riferimento del metodo da invocare, determinato dal tipo d istanza effettivamente riscontrato. POLIMORFISMO Il riferimento ritardato dei metodi da invocare, in base all istanza effettivamente legata all oggetto, consente di adattare dinamicamente l esecuzione del programma sulla realtà effettuale che si riscontra al momento. Questo meccanismo di adattamento è detto polimorfismo, ovvero «delle molte forme»; il polimorfismo è quindi un procedimento con cui il comportamento di una locazione di tipo oggetto modifica il suo comportamento conformandosi dinamicamente all istanza di riferimento. Gli esempi precedenti sono basati su un vettore di oggetti. In realtà l adattamento può avvenire in molte occasioni. Per esempio, nell ipotesi che Verso sia un metodo virtuale di Mostro, ridefinito (override) nelle classi derivate Mannaro e Vampiro: Mostro m; m = new Mostro (); m.verso (); m = new Mannaro (); m.verso (); m = new Vampiro(); m.verso (); // m è una variabile di tipo Mostro // m ha un comportamento da Mostro // m ha un comportamento da Mannaro // m ha un comportamento da Vampiro Un esempio importante di uso di polimorfismo può essere quello dei parametri di tipo oggetto. Per esempio nel metodo seguente: public void Comportamento ( Mostro p ) p.verso (); il parametro p è di tipo Mostro, ma potrebbe ricevere un passaggio di un oggetto derivato come nelle seguenti invocazioni:

DISPENSA 15-05_OOP_POLIMORFISMO_[06] PAG. 5 Mostro m; // m è una variabile di tipo Mostro m = new Mostro (); Comportamento ( m ) ; // m ha un comportamento da Mostro m = new Mannaro (); Comportamento ( m ) ; // m ha un comportamento da Mannaro m = new Vampiro(); Comportamento ( m ) ; // m ha un comportamento da Vampiro ESERCITAZIONE PROGETTO GUIDATO Si deve avviare Visual Studio e si deve preparare il Form1 come nella figura qui illustrata Si passi al codice e si dichiarino le seguenti classi: public class Uccello virtual public void Verso() MessageBox.Show("cip cip", "Uccello"); public class Corvo : Uccello override public void Verso() MessageBox.Show("cra cra", "Corvo"); public class Oca : Uccello override public void Verso() MessageBox.Show("qua qua", "Oca"); //--- variabile globale Uccello u; Button1 u = new Uccello(); u.verso();

DISPENSA 15-05_OOP_POLIMORFISMO_[06] PAG. 6 Button2 Button3 u = new Corvo(); u.verso(); Si esegua il progetto. u = new Oca(); u.verso();

DISPENSA 15-05_OOP_POLIMORFISMO_[06] PAG. 7 ESERCIZI ESERCIZI SUL POLIMORFISMO E S E R C I Z I Esercizio 1) DATA E ORARIO Si deve implementare una classe Data che rappresenta una data del calendario Gregoriano; la data ha tre attributi privati: giorno, mese e anno. La data ha i seguenti costruttori pubblici: a. Senza parametri, crea la data 1/1/1900; b. Con tre parametri, crea la data secondo i parametri indicati; La data ha i seguenti metodi pubblici virtuali: c. ToString, che rende la data in forma di unica stringa; d. Bisestile, che rende true se l anno è bisestile, falso altrimenti; e. Leggi, imposta la data secondo tre parametri in modo valore; f. Scrivi, rende la data secondo tre parametri in modo risultato; g. Domani, che incrementa la data e la porta al giorno successivo; h. Ieri, che decrementa la data e la porta al giorno precedente; i. Giorno, che rende la stringa del giorno della settimana (es. Domenica); Si deve implementare una classe DataOra che rappresenta un orario e una data del calendario Gregoriano; la classe è derivata da Data ma dichiara tre attributi privati ore, minuti e secondi; La classe deve ridefinire i precedenti costruttori pubblici e aggiungere il seguente: j. Con sei parametri, crea la data e l orario secondo i parametri indicati; La classe deve definire l override dei seguenti metodi pubblici virtuali: k. ToString, che rende data e orario in forma di unica stringa; La classe deve definire l overload dei seguenti metodi pubblici: Esercizio 2) l. Leggi, imposta data e orario secondo tre parametri in modo valore; m. Scrivi, rende la data secondo tre parametri in modo risultato; CLASSE RECIPIENTE Si deve implementare una classe Recipiente che rappresenta un contenitore di liquidi; la classe possiede l attributo capacità e contenuto, entrambi interi; La classe ha i seguenti costruttori pubblici: n. Senza parametri, che crea un contenitore vuoto di capacità 1000 ml; o. Con un parametro K intero, che crea un contenitore vuoto di capacità di K ml; La classe ha i seguenti metodi pubblici virtuali: p. ToString, Get e Set, che svolgono i consueti compiti; q. Metti, con un parametro K intero, che aggiunge al contenitore K ml, purché non ecceda la capacità del recipiente; r. Togli, con un parametro K intero, che toglie K ml dal contenitore, purché esso li contenga (non può diventare meno che vuoto); Si deve implementare una classe Bicchiere derivata da Recipiente che rappresenta un contenitore di

DISPENSA 15-05_OOP_POLIMORFISMO_[06] PAG. 8 liquidi, la cui capacità non può eccedere i 1000 ml; La classe deve ridefinire tutti i costruttori pubblici: s. Senza parametri, che crea un contenitore vuoto di capacità 100 ml; t. Con un parametro K intero, che crea un contenitore vuoto di capacità di K ml; se K eccede 1000 ml, è creato da 1000 ml esatti; La classe deve ridefinire i metodi pubblici virtuali: u. ToString, Get e Set, che svolgono i consueti compiti; Esercizio 3) FIGURE PIANE POLIGONO RETTANGOLO TRIANGOLO ELLISSE QUADRATO TRIRETTANGOLO CERCHIO Lo studente predisponga le classi sopra illustrate e le fornisca dei seguenti attributi privati e metodi pubblici: Lati (double) o Raggi (double) Area( ) Perimetro( ) QuantiLati ( ) Metodi Set e Get che impostino gli attributi (tutti) Lo studente ipotizzi quindi almeno due costruttori per ogni classe di cui: Uno senza parametri che prepari l oggetto in modo standard Uno con parametri che inizializzi tutti gli attributi Lo studente dichiari quindi una lista tipizzata di Poligoni e visualizzi in una listbox l elenco delle loro aree:

DISPENSA 15-05_OOP_POLIMORFISMO_[06] PAG. 9 Esercizio 4) ANIMALI ANIMALE PESCE UCCELLO MAMMIFERO PESCESPADA NARVALO PINGUINO PULCINELLA DELFINO ORCA Lo studente predisponga le classi sopra illustrate e le fornisca dei seguenti attributi privati e metodi pubblici: Specie (stringa), Gestazione (in giorni, intero), Riproduzione (in esemplari riprodotti, intero), Verso (stringa), ToString (che rende la stringa con le caratteristiche dell animale) Genera (che rende un numero casuale inferiore alla sua Riproduzione) Lo studente ipotizzi quindi almeno due costruttori per ogni classe di cui: Uno con parametri che inizializzi tutti gli attributi Uno senza parametri che prepari l oggetto in modo standard Lo studente dichiari quindi una lista tipizzata di Animali e visualizzi in una listbox l elenco delle loro caratteristiche: Esercizio 5) VEICOLI VEICOLO NATANTE FERROVIARIO GOMMATO BARCA A VELA MOTO SCAFO TRENO TRAM CAMION AUTO Lo studente predisponga le classi sopra illustrate e le fornisca dei seguenti attributi privati e metodi pubblici: peso, numeroruote, autonomia, marce, velocitàmax, caricomax, numpasseggeri ToString (che rende la stringa con le caratteristiche dell oggetto) Lo studente ipotizzi quindi almeno due costruttori per ogni classe di cui: Uno con parametri che inizializzi tutti gli attributi Uno senza parametri che prepari l oggetto in modo standard Lo studente dichiari quindi una lista tipizzata di Veicoli e visualizzi in una listbox l elenco delle loro caratteristiche:

DISPENSA 15-05_OOP_POLIMORFISMO_[06] PAG. 10 Esercizio 6) PACCHI PACCO SCATOLA TETRAEDRO CAPSULA CUBICA SFERA ELLISSOIDE Lo studente predisponga le classi sopra illustrate e le fornisca dei seguenti attributi privati e metodi pubblici: Tipo (nome della classe), misure (int, in cm), Volume e Superficie laterale ToString (che rende la stringa con le caratteristiche dell oggetto, inclusi Volume e Superficie) Lo studente ipotizzi quindi almeno due costruttori per ogni classe di cui: Uno con parametri che inizializzi tutti gli attributi Uno senza parametri che prepari l oggetto in modo standard Lo studente dichiari quindi una lista tipizzata di Pacchi e visualizzi in una listbox l elenco del loro volume ordinato per capacità crescente: Esercizio 7) VEICOLI VEICOLO NATANTE FERROVIARIO GOMMATO BARCA A VELA MOTO SCAFO TRENO TRAM CAMION AUTO Lo studente predisponga le classi sopra illustrate e le fornisca dei seguenti attributi privati e metodi pubblici: peso, numeroruote, autonomia, marce, velocitàmax, caricomax, numpasseggeri ToString (che rende la stringa con le caratteristiche dell oggetto) Lo studente ipotizzi quindi almeno due costruttori per ogni classe di cui: Uno con parametri che inizializzi tutti gli attributi Uno senza parametri che prepari l oggetto in modo standard Lo studente dichiari quindi una lista tipizzata di Veicoli e visualizzi in una listbox l elenco delle loro caratteristiche:

DISPENSA 15-05_OOP_POLIMORFISMO_[06] PAG. 11 S O M M A R I O INTRODUZIONE AL POLIMORFISMO... 2 UN EFFETTO COLLATERALE... 2 Limiti dei metodi2 METODI VIRTUALI... 3 La parola chiave Virtual... 3 La parola chiave override... 3 Esempio di metodi virtuali... 3 Riferimento ritardato... 4 polimorfismo 4 ESERCITAZIONE... 5 Progetto guidato... 5 ESERCIZI... 7 ESERCIZI SUL POLIMORFISMO... 7 Esercizio 1) Data e Orario... 7 Esercizio 2) Classe Recipiente... 7 Esercizio 3) Figure Piane... 8 Esercizio 4) Animali... 9 Esercizio 5) Veicoli... 9 Esercizio 6) Pacchi... 10 Esercizio 7) Veicoli... 10