Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoIlario Di Giovanni Modificato 9 anni fa
1
Esercitazione del 9 marzo 2007 Ereditarieta’
2
Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio di Sostituzione
3
Se c1 è una sottoclasse di (estende) c2 le variabili e metodi statici di c2 (e delle sue superclassi) sono visibili direttamente da c1 variabili e metodi di istanza di c2 (e delle sue superclassi) diventano anche variabili e metodi di istanza di c1 (a meno di overriding) Ereditarieta’
4
Una sottoclasse puo’ sovrascrivere un metodo della superclasse (stesso nome, stessi parametri, stesso tipo) In tal caso sugli oggetti della sottoclasse viene utilizzato il metodo sovrascritto (quello piu’ specifico) Overriding
5
Anche per i costruttori esiste un meccanismo di ereditarietà se c1 e’ sottoclasse di c2 all’atto della creazione di una istanza di c1 si esegue automaticamente il costruttore (senza parametri) di c2 (per inizializzare le variabili ereditate) Costruttori
6
Superclasse Persona Sia dia l’implementazione della seguente classe Persona
7
public class Persona { //OVERVIEW: una Persona e’ caratterizzata dal nome //(una stringa) e dall’indirizzo (una stringa) public Persona(String nome,String indirizzo) { //EFFECTS: costruisce una nuova Persona con nome // nome ed indirizzo indirizzo} public String getNome() { //EFFECTS: restituisce il nome di this } public String getIndirizzo() { //EFFECTS: restituisce l’indirizzo di this } public String toString() { //EFFECTS: restituisce una stringa che riporta nome ed //indirizzo di this } public boolean equals(Persona p) { //EFFECTS: restituisce true sse this e’ uguale a p } }
8
Implementazione Variabili d’istanza private Attenzione al metodo equals, deve confrontare lo stato interno dei due oggetti e non il riferimento
9
Sottoclasse Si definisca una sottoclasse Studente di Persona le istanze di Studente sono caratterizzate oltre che dal nome e dall’indirizzo, anche dal numero di matricola (un intero)
10
Metodi e Costruttori Il costruttore, prende come parametro il nome e l’indirizzo ed il numero di matricola inoltre, vogliamo un metodo aggiuntivo public int getMatricola(){ //EFFECTS: restituisce la matricola di this }
11
Cosa fare? Progettare la specifica della classe: intestazione classe=====> costruttori + metodi + descrizione informale
12
Dopo la specifica Scegliere le variabili d’istanza adatte a rappresentare lo stato interno Implementare i metodi di conseguenza
13
Attenzione: specifica Deve contenere costruttori e metodi aggiuntivi rispetto alla superclasse Deve contenere i metodi overridden (se necessario)
14
Metodi d’istanza Quali metodi devono essere ereditati? Quali devono essere sovrascritti?
15
Metodi Ereditati I public String getNome() { //EFFECTS: restituisce il nome di this } public String getIndirizzo() { //EFFECTS: restituisce l’indirizzo di this } FUNZIONANO CORRETTAMENTE!
16
Metodi Ereditati II public String toString() { //EFFECTS: restituisce una stringa che riporta nome ed //indirizzo di this } public boolean equals(Persona p) { //EFFECTS: restituisce true sse this e’ uguale a p } NON SONO ADEGUATI =========> VANNO SOVRASCRITTI
17
toString() di Studente public String toString() { //EFFECTS: restituisce una stringa che riporta nome ed //indirizzo e numero di matricola di this } Overriding: dobbiamo dichiarare lo stesso metodo (stessa intestazione), specializzandone specifica ed l’implementazione
18
equals() di Studente public boolean equals(Persona p) { //EFFECTS: restituisce true sse this e’ uguale a p } Overriding: dobbiamo dichiarare lo stesso metodo (stessa intestazione), specializzandone specifica ed l’implementazione Il parametro e’ di tipo Persona
19
Metodo overridden public boolean equals(Persona p) { //EFFECTS: restituisce true sse this e’ uguale a p (ha stesso nome, indirizzo e numero di matricola) } Possiamo usarlo per confrontare due oggetti di tipo Studente Perche’????
20
Domanda Se vogliamo confrontare Studenti non sarebbe piu’ naturale usare? public boolean equals(Studente p) { //EFFECTS: restituisce true sse this e’ uguale a p } Attenzione: non e’ un metodo sovrascritto e’ un metodo nuovo
21
Overloading Nella classe Studenti avremmo due metodi equals METODO EREDITATO: public boolean equals(Persona p) { //EFFECTS: restituisce true sse this e’ uguale a p } METODO NUOVO: public boolean equals(Studente p) { //EFFECTS: restituisce true sse this e’ uguale a p } L’interprete sceglie quale eseguire in base al tipo del parametro
22
Soluzione migliore Sovrascrivere quello di Persona in modo che, se il parametro non e’ di tipo Studente viene segnalato un errore di tipo a run-time METODO SOVRASCRITTO: public boolean equals(Persona p) { //EFFECTS: restituisce true sse this e’ uguale a p Studente s= (Studente) p; ……………………. }
23
Attenzione: implementazione Il costruttore di Studente deve assegnare i valori a tutte le variabili (nuove ed ereditate) Ereditarieta’ del costruttore: automatica solo per quello di default (senza parametri) Nella superclasse Studente non il costruttore richiede i parametri
24
Problema Variabili della superclasse sono private Bisogna usare costruttori e metodi della superclasse (tramite super) Alternativa protected
25
Principio di Sostituzione Un oggetto del sottotipo può essere utilizzato dovunque sia richiesto un oggetto del supertipo Un oggetto di tipo Studente puo’ essere usato ovunque sia richiesto un oggetto di tipo Persona Per capire questo concetto scriviamo del codice che usa il supertipo Persona
26
Archivio Un Archivio Memorizza informazioni su un insieme di persone (oggetti di tipo Persona o suoi sottotipi) di dimensione fissata Vogliamo che nell’insieme non ci siano ripetizioni
27
Specifica I public class Archivio { //OVERVIEW: un Archivio e’ un insieme di Persona // senza ripetizioni di dimensione fissa public Archivio(int dim) { //EFFECTS: costruisce un nuovo Archivio vuoto di dimensione dim} public String toString() { //EFFECTS: restituisce una stringa che descrive l’insieme //di persone contenute in this }
28
Specifica II public String cercanome(String indirizzo) { //EFFECTS: restituisce il nome di una Persona con indirizzo indirizzo che occorre in this, altrimenti restituisce la stringa vuota } public String cercaindirizzo(String nome) { //EFFECTS: restituisce l’indirizzo di una Persona con nome nome che occorre in this, altrimenti restituisce la stringa vuota }
29
Specifica III public boolean insert(Persona p) { //MODIFIES: this //EFFECTS: se p non occorre gia’ in this e ci sono ancora posizioni libere lo inserisce e restituisce true, altrimenti restituisce false } public boolean remove(Persona p) { //MODIFIES: this //EFFECTS: se p appartiene a this lo rimuove e restituisce true, altrimenti restituisce true } }
30
Implementazione Le variabili d’istanza che implementano lo stato devono essere private Usare un array (analogo all’esercizio della Banca) Altrimenti non si puo’ garantire la proprieta’ per per costruzione (simile a Banca)
31
Testing Archivio e’ definito per il supertipo Persona Puo’ memorizzare oggetti di un qualsiasi sottotipo (ex Persona)
32
Nel main Studente x1=new Studente(“Fra”,”Pisa”, 12); Studente x2=new Studente(“Fra”,”Pisa”,13); Archivio a= new Archivio(5); boolean c=a.insert(x1); boolean c= a.insert(x2); Per confrontare studenti a run-time viene scelto il metodo equals piu’ specifico: quello overriden della sottoclasse ! Quello della superclasse non e’ adatto (differiscono solo per il numero di matricola)
33
Passo successivo Cosa devo riprogettare se voglio una versione ordinata? Gli oggetti Persona siano memorizzati in modo ordinato (per costruzione) Ordinamento: in base al nome del titolare e all’indirizzo (usando l’ordinamento lessicografico tra stringhe) Quali metodi DEVONO essere modificati in modo da garantire la proprieta’? Quali metodi POSSONO essere modificati per migliorarne l’efficienza?
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.