Gerarchia di classi Java

Slides:



Advertisements
Presentazioni simili
Il paradigma Object Oriented
Advertisements

Programmazione ad oggetti
TAV.1 Foto n.1 Foto n.2 SCALINATA DI ACCESSO ALL’EREMO DI SANTA CATERINA DEL SASSO DALLA CORTE DELLE CASCINE DEL QUIQUIO Foto n.3 Foto n.4.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unit à B2 Gli oggetti: concetti avanzati.
Recupero debito quarto anno Primo incontro
Recupero debito quarto anno Secondo incontro
Informatica Recupero debito quarto anno Terzo incontro.
Informatica 2 Lezione 4 Corso di laurea in matematica Informatica 2 Dott. Ing. Leonardo Vito Corso di laurea matematica indirizzo matematica per le applicazioni.
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Semantica Operazionale di un frammento di Java: lo stato.
Le gerarchie di tipi.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Frontespizio Economia Monetaria Anno Accademico
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
Ufficio Studi UNIONCAMERE TOSCANA 1 Presentazione di Riccardo Perugi Ufficio Studi UNIONCAMERE TOSCANA Firenze, 19 dicembre 2000.
eliana minicozzi linguaggi1a.a lezione2
Derivazione tra classi
Overriding.
AA 2005/06 Informatica Programmazione M.A. Alberti-L. Capra 1 Le eccezioni in Java Programmazione Corso di laurea in Informatica.
Oggetti e dati primitivi
Programmazione Corso di laurea in Informatica
AA2003/04 © M.A. Alberti Programmazione Eccezioni 1 Le eccezioni in Java Programmazione Corso di laurea in Informatica.
Oggetti e dati primitivi Programmazione Corso di laurea in Informatica.
Istruzioni di selezione in Java Programmazione Corso di laurea in Informatica.
Approfondimento delle classi
Dichiarazione di classi Programmazione Corso di laurea in Informatica.
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
1 laboratorio di calcolo II AA 2003/04 quinta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
1 laboratorio di calcolo II AA 2003/04 quarta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Java base IV: Java e la programmazione O.O.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Programmazione in Java (8)
Ereditarietà e Polimorfismo
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Fondamenti di Programmazione Prof.ssa Elisa Tiezzi
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill,
I nomi in Java F. Bombi 18 novembre novembre 2003.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Ereditarietà.
Programmazione ad oggetti
Programmazione ad oggetti
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
1 Osservazioni Generali Struttura di programma Gerarchia di classi: overloading, overriding, e dispatching Analisi ed esecuzione Modificabilità e condivisione.
Fondamenti di Informatica II Ingegneria Informatica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
Cose nuove di Java (prima a chiacchiera, poi formalmente)
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
La Programmazione ad Oggetti
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
28/12/2001package 1 Package Pacchetti e interfacce.
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Eccezioni in Java. Le eccezioni in Java Exception handling: insieme di costrutti e regole sintattiche e semantiche presenti nel linguaggio allo scopo.
Transcript della presentazione:

Gerarchia di classi Java Programmazione Corso di laurea in Informatica

Specializzare un modello Una classe modella un pezzo di realtà Una macchina, una moneta, un impiegato Spesso è necessario specializzare la versione originale del modello Un dirigente è un particolare impiegato Dichiarazione di classi che illustra l’idea Occorre evitare la duplicazione dei dati Alcuni metodi sono utili per entrambe le classi Specializzare le classi e l’ereditarietà AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Ereditarietà Consiste nel definire una classe tramite un’altra già definita In Java, per stabilire una relazione di sottoclasse, si usa la parola riservata extends public class Dirigente extends Impiegato { public String divisione; } AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Ereditarietà Il poter definire una struttura gerarchica tra le classi costituisce una fondamentale tecnica dell’approccio object-oriented facilita il disegno del software e ne promuove il riuso Derivare nuove classi da già definite Creare una gerarchia tra classi Controllare l’ereditarietà con il modificatore protected Polimorfismo tramite ereditarietà AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Ereditarietà La classe esistente viene detta classe antenato o superclasse o anche classe base La nuova classe derivata viene detta classe figlio o sottoclasse. Come i nomi suggeriscono, il figlio eredita alcune caratteristiche dal genitore o antenato La sottoclasse eredita metodi e dati dalla superclasse AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Ereditarietà Nel diagramma di classe si mette in evidenza la relazione tra classe e sottoclasse introdotta dall’ereditarietà la freccia è rivolta verso la superclasse L’ereditarietà implementa una relazione is-a, cioè il figlio è una versione più specifica del padre Veicoli Macchina AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Definire sottoclassi L’ereditarietà è appropriata ogni volta che esiste una relazione è_un o is_a tra due oggetti. Il dirigente è un particolare impiegato Ha senso definire la classe Dirigente come una sottoclasse di Impiegato La classe Dirigente eredita dalla classe Impiegato alcune caratteristiche e funzionalità AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Definire sottoclassi Un quadrato è un particolare rettangolo, che è un tipo di poligono La classe Quadrato estende la classe Rettangolo, sottoclasse di Poligono. Un taxi è una particolare macchina che è un particolare veicolo class Taxi extends Macchina { … } A sua volta la classe Macchina è_un particolare Veicolo class Macchina extends Veicolo { … } Un Dizionario è un tipo di Libro Libro.java, Dizionario.java con TestDizionario.java AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Gerarchie di classi Una sottoclasse può essere superclasse di un proprio discendente Così si forma una gerarchia di classi poligono concavo convesso quadrato triangolo stella AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Gerarchie di classi Due discendenti della stessa superclasse si dicono fratelli Un buon disegno di relazioni tra classi mette tutte le caratteristiche comuni il più alto possibile in gerarchia Un membro ereditato viene passato verso il basso nella linea di discendenza La gerarchia spesso deve essere estesa e modificata per soddisfare esigenze che cambiano Non esiste la gerarchia appropriata a tutte le situazioni AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Ereditare dalla superclasse La sottoclasse eredita dalla superclasse e da tutti gli antenati. In particolare eredita: Tutti i membri (variabili e metodi) della superclasse accessibili a quella sottoclasse, a meno che Esplicitamente nasconda le variabili o ne sovrascriva i metodi, ridefinendoli. I costruttori non sono membri di una classe e perciò non vengono ereditati dalle sottoclassi. AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

I membri accessibili Una sottoclase eredita i membri accessibili della superclasse, dichiarati: public o protected nella superclasse di default, senza modificatore, purchè siano nello stesso pacchetto della superclasse Una sottoclasse non eredita i membri dichiarati private dalla superclasse con lo stesso nome nella sottoclasse Variabili oscurate Metodi sovrascritti AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Variabili oscurate class Sopra { Number unNumero; } class Sotto extends Sopra { Float unNumero; La variabile unNumero nella classe Sotto oscura la visibilità della variabile unNumero della classe Sopra AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

I modificatori di visibilità Servono per controllare l’ereditarietà Determinano quali membri della classe vengono o non vengono ereditati Si ereditano le variabili e i metodi dichiarati con visibilità public, ma non quelli con visibilità private Le variabili public violano la regola di incapsulare i dati Quando si vuole stabilire una relazione di ereditarietà possiamo usare un terzo modificatore di visibilità: protected AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Il modificatore protected Il modificatore di visibilità protected consente ai figli di ereditare i membri di una classe base Il modificatore protected favorisce l’incapsulamento più del modificatore public Ma il modificatore protected non contribuisce all’incapsulamento in modo stretto come private I dettagli in appendice F del testo Lewis-Loftus AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Il riferimento super Il riferimento super viene usato per riferirsi alla superclasse. Per accedere a variabili, a metodi o a costruttori della superclasse Spesso occorre usare il costruttore dell’antenato per inizializzare i campi di un oggetto figlio, relativi all’antenato, cioè ereditati dalla superclasse AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Il riferimento super Tramite il riferimento super si possono accedere variabili oscurate dalla sottoclasse La variabile unNumero della classe Sopra è accessibile anche dalla classe Sotto super.unNumero O ai metodi sovrascritti della superclasse AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Sovrascivere metodi Una classe figlio può sovrascrivere la definizione di un metodo ereditato per specializzarlo Un figlio può dover modificare un metodo ereditato Il nuovo metodo deve avere lo stesso prototipo del metodo della superclasse, ma un diverso corpo Il tipo dell’oggetto a cui è inviato il metodo determina la versione del metodo invocato AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Sovrascivere metodi Il metodo della superclasse può essere esplicitamente invocato mediante il riferimento super Se un metodo è dichiarato anche con il modificatore final allora non può essere sovrascritto La sovrascrittura può essere applicata a variabili si dice che le variabili sono oscurate Disinfettante.java, e la sottoclasse Detergente.java Massima.java, Consiglio.java con Messaggi.java AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Regole per sovrascrivere metodi Il prototipo dei due metodi deve essere identico: stesso tipo di rientro e parametri Il metodo sovrascritto non può essere meno accessibile del metodo originale Un metodo sovrascritto non può sollevare differenti tipi di eccezioni rispetto al metodo originale AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Costruttori della sottoclasse I costruttori non vengono ereditati, non essendo membri di classe Vengono definiti esplicitamente dal programmatore Oppure viene usato quello di default Il costruttore di default è quello senza argomenti fornito automaticamente quando non ne avete definito uno AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Chiamata al costruttore della sottoclasse Quando un oggetto viene instanziato, viene generata una sequenza d’azioni: Viene allocato lo spazio per il nuovo oggetto sullo heap. Tutte la variabili d’istanza, anche quelle ereditate vengono inizializzate ai valori di default. Si esegue la chiamata esplicita a un costruttore della stessa classe (this()) se c’è Altrimenti si invoca il costruttore esplicito o implicito della superclasse e si inizializzano le variabili d’istanza nell’ordine in cui appaiono nel codice. Si esegue il resto del codice del costruttore I passi da 2. a 4. vengono ripetuti ricorsivamente per tutte le classi della gerarchia. AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Ordine della chiamata al costruttore Java richiede che sia completamente inizializzato l’oggetto che descrive il padre prima che si possa eseguire una qualunque computazione sul figlio Chiamata implicita al costruttore della superclasse Arte.java, Disegno.java e Schizzo.java Chiamata esplicita al costruttore della superclasse tramite super Libro_2.java, Dizionario_2.java con TestDizionario_2.java AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Costruzione dell’oggetto della sottoclasse Di default ogni costruttore di sottoclasse chiama il costruttore senza argomenti del padre Se il padre non ne ha uno la sottoclasse non viene compilata Se la superclasse ha costruttori con parametri, si invoca super con parametri appropriati per controllare esplicitamente la costruzione dell’oggetto padre La chiamata a super deve essere la prima istruzione del costruttore AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Ereditarietà singola e multipla Java fornisce solo ereditarietà singola La sottoclasse deriva da una sola superclasse L’ereditarietà multipla consente la derivazione di una classe da più classi antenati, e di ereditare i membri di più classi L’ereditarietà multipla introduce ambiguità, che devono essere risolte Ad esempio: lo stesso nome di variabile in più classi Nella maggior parte dei casi, l’uso di interfacce supera i limiti dell’ereditarietà singola senza le complicazioni di quella multipla AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Sovraccaricare vs. sovrascrivere I concetti di sovraccaricamento e di sovrascrittura sono diversi Sovraccaricare si riferisce alla possibilità di definire più metodi nella stessa classe con lo stesso nome ma segnature diverse Il sovraccaricamento consente di definire operazioni simili in modi diversi con dati diversi Sovrascrivere si riferisce a due metodi, uno della superclasse e uno della sottoclasse, che devono avere lo stesso prototipo La sovrascrittura consente di definire operazioni simili in modi diversi per oggetti diversi AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Diagramma delle classi Object …. …. …. …. …. …. …. …. …. …. …. …. AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

La classe Object La classe Object è predefinita nel pacchetto java.lang della libreria standard di classi Tutte le classi discendono dalla classe Object Se una classe non è esplicitamente dichiarata discendente da una superclasse, si assume che discenda dalla classe Object La classe Object è la radice di tutti gli alberi di discendenza AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

La classe Object La classe Object contiene alcuni metodi, pochi ma utili, che vengono ereditati da tutte le classi Il metodo toString ad esempio è definito per la classe Object Il metodo toString della classe Object restituisce una stringa di caratteri contenete il nome della classe e un valore che identifica l’oggetto univocamente Ogni volta che definiamo esplicitamente toString, in effetti lo riscriviamo AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

La classe Object Il metodo println richiama il metodo toString per ogni oggetto che gli viene passato come parametro perché tutti gli oggetti hanno un metodo toString ottenuto per ereditarietà Il metodo equals della classe Object determina se due riferimenti sono alias Spesso è necessario riscrivere equals per definire il metodo con una semantica appropriata Studente.java, StudenteDott.java con Accademia.java AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Decomposizione di metodi e ereditarietà Nella decomposizione di metodi spesso si usano metodi di servizio richiamati all’interno di un metodo, in genere dichiarati private Un problema se il metodo di servizio deve essere ereditato e sovrascritto Figure.java superclasse Triangle.java, Box.java e Diamond.java Driver.java AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Classi astratte Una classe incompleta che contiene metodi astratti È un segnaposto nella gerarchia delle classi, modella un concetto generico Il modificatore abstract nell’intestazione della classe Una classe abstract diventa incompleta per definizione La classe abstract non può essere instanziata ma deve essere specializzata AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Classi astratte Una classe deve essere dichiarata astratta se: Contiene la dichiarazione di un metodo astratto Eredita un metodo astratto dalla superclasse e non ne fornisce l’implementazione Dichiara di implementare un interfaccia, ma non fornisce l’implementazione di tutti i metodi AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Classi astratte Il discendente di una classe astratta deve sovrascrivere i metodi astratti della superclasse da cui discende o sarà considerata anche lei astratta Un metodo astratto non può essere definito final, static o private Perché dovrà essere sovrascritto (final) Perchè non ha ancora una definizione (static) Perchè non potrebbe essere ereditato (private) Una questione di scelta di disegn Aiuta a stabilire gli elementi comuni che dovranno avere le sottoclassi di una classe che rappresenta un concetto astratto AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Classe astratte – sintesi Una classe astratta è definita con il modificatore abstract Può contenere metodi implementati e costruttori. Se ha almeno un metodo astratto allora deve essere dichiarata astratta. Non è possibile istanziarla. Spesso dichiara una variabile del tipo classe astratta, in cui poi si archvivia il riferimento a oggetti delle sottoclassi Le sottoclassi devono fornire implementazione per tutti i metodi astratti o anche loro saranno considerate astratte. I metodi astratti non possono essere dichiarati con i modificatori private, static o final. AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Quando sono appropriate Non si devono istanziare oggetti della classe. La dichiarazione abstract garantisce che non verrà mai istanziata. I dati comuni possono essere raccolti in una superclasse, anche senza metodi. Qui si usa una gerarchia di classi in cui una classe serve per scambiare dati ma non ci sono metodi comuni Iniziare una gerarchia di classi che devono essere specializzate ulteriormente Qui si usa la classe astratta per contenere metodi la cui specializzazione è rinviata alle classi specializzate Definire il comportamento fondamentale della classe senza darne l’implementazione AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Riferimenti ed ereditarietà Tramite riferimenti si può accedere a un oggetto legato alla classe da una relazione di ereditarietà Se la classe Festa ha una sottoclasse Natale, allora una variabile a riferimento della classe Festa può anche essere usata per puntare a un oggetto Natale Festa Natale Festa giorno; giorno = new Natale(); AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Riferimenti e ereditarietà Nella gerarchia di classi la sottoclasse specializza la superclasse e introduce nuove funzionalità Ma la nuova classe può essere vista come un tipo di quella esistente Questo consente l’upcasting La nuova classe è costituita dagli elemneti della classe base cui aggiunge i propri L’upcasting è sempre lecito AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

public void suona() {…} static void brano (Strumento s) { … s.suona() class Strumento { public void suona() {…} static void brano (Strumento s) { … s.suona() } Class Archi extends Strumento { public static void main(String[] a) { Archi violino = new Archi(); Strumento.brano(violino); Al metodo di classe brano viene passato un parametro di tipo Archi e non di tipo Strumento. Il riferimento a Archi, violino, viene convertito a un riferimento a Strumento, mediante un upcasting. AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Riferimenti ed ereditarietà Possiamo assegnare a variabili a riferimento di una superclasse un oggetto di una sottoclasse, semplicemente con un assegnamento Conversione larga o upcasting Assegnare a un oggetto discendente il riferimento a un antenato può essere fatto, ma richiede un cast esplicito Conversione stretta o downcasting La conversione larga è più utile e meno pericolosa AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Polimorfismo via ereditarietà Un riferimento polimorfico punta a oggetti di tipo diverso in tempi diversi Le interfacce possono essere usate per creare riferimenti polimorfici L’ereditarietà può essere usata come base del polimorfismo Una variabile a riferimento può puntare a un oggetto in un dato istante e puntarne a un altro (legato al primo nella struttura gerarchica delle classi) in un altro momento AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Polimorfismo via ereditarietà Sia celebrare un metodo della classe Festa, sovrascritto dalla classe Natale L’invocazione giorno.celebrare(); produce effetti diversi: Se giorno si riferisce a un oggetto della classe Festa, viene invocata la versione celebrare() della classe Festa; se invece punta a un oggetto della sottoclasse Natale verrà invocata la versione specifica e sovrascritta della sottoclasse AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Polimorfismo via ereditarietà È il tipo dell’oggetto cui si punta, che determina quale metodo viene invocato Si noti che, se l’invocazione avviene in un ciclo, la stessa riga di codice potrebbe eseguire metodi diversi a ogni passo I riferimenti polimorfici vengono risolti a run-time, e non durante la compilazione AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Polimorfismo via ereditarietà Data la seguente struttura gerarchica: Personale Volontario Dipendente Impiegato Giornaliero AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Polimorfismo via ereditarietà Si risolve il compito di calcolare la retribuzione … Istituzione.java driver con il main Staff.java inizializza la lista del personale Personale.java la classe astratta Dipendente.java modella un dipendente generico Volontario.java modella un volontario Impiegato.java modella un impiegato che può prendere gratifiche, specializzando un dipendente Giornaliero.java modella un lavoratore a giornata, specializzando un dipendente generico AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Accesso indiretto Tutti i membri della superclasse sono accessibili alla sottoclasse, anche se non sono ereditati I membri di classe ereditati sono accessibili direttamente I membri non ereditati sono accessibili indirettamente tramite i metodi ereditati della superclasse Calorie.java driver, istanzia una Pizza Cibo.java istanzia un oggetto con dati grammi di grasso e calcola le calorie dovute al grasso Pizza.java Nell’esempio, Calorie istanzia una variabile di riferimento alla classe Pizza, poi invoca il metodo caloriePerPorzione() della sua superclasse Cibo. Quindi Pizza usa i membri privati grammiGrasso, CALORIE_X_GRAMMO_GRASSO indirettamente, cioè non tramite il loro nome. La classe Pizza accede tramite il costruttore della superclasse al membro della superclasse che è privato e non viene perciò ereditato. AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Composizione di classi vs ereditarietà Object is-a Piatto Posto_a_tavola Posata Piatto_cena Tavola Cucchiaio Forchetta cucch forch Coltello has-a colt piatti Tavola.java AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi

Gerarchie di interfacce Il meccanismo dell’ereditarietà può essere applicato alle interfacce Un’interfaccia può diventare l’antenata di un’altra L’interfaccia figlio eredita tutti i metodi astratti dal genitore Una classe che implementa un’interfaccia derivata deve definire tutti i metodi dell’intarfaccia genitore oltre a quelli del figlio Le gerarchie di classi e quelle di interfacce sono distinte AA 2003/04 © M.A. Alberti Programmazione Gerarchie di classi