Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Oggetti Java.
Recupero debito quarto anno Secondo incontro
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
29 febbraio 2008 Progettare tipi di dato astratti.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
Esercitazione Frame. Argomento Realizzazione di un tipo di dato astratto Usare le eccezioni per segnalare situazioni particolari Invariante e funzione.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica
Approfondimento delle classi
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.
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)
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Oggetti in C# Lezione 1 Classi ed istanze Oggetti in C# - Lezione 1.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
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 Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Compitino del 2004 Alberi Generici. Idea Si vuole un tipo di dato astratto che definisca una struttura ad albero in cui nodi e foglie hanno associato.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Liste di Interi Esercitazione. IntList Lista di interi Una lista è una disposizione ordinata di elementi ( non in modo crescente-descrescente, ma per.
1 Gerarchie e polimorfismo: liste. 2 Generalizzare le liste di interi  List 4 lista di oggetti –non modificabile 4 vorremo poi definire un sottotipo.
Esercitazione Object, Vettori, Liste. Ereditarieta’ Abbiamo visto come tramite l’ereditarieta’ e’ possibile estendere classi esistenti -arricchendo lo.
1 Laboratorio di Introduzione alla Programmazione §II MODULO §3 crediti §Esame e voto unico (su 6 crediti totali)
Ese 1 (del 31 Marzo 2004). Il compilatore Non esegue il programma, non guarda i valori che possono assumere di volta in volta le variabili, non fa assunzioni.
LIP: 9 Maggio Esercizi Riprendiamo un esercizio proposto Definire un tipo di dato Persona che definisce oggetti che rappresentano le informazioni.
1 Progettare un Tipo di Dato Astratto. 2 Scelte di Progetto (astrazione) 4 Caratteristiche degli oggetti –Modificabilità 4 Scelta delle operazioni –Realizzare.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
LIP: 8 Marzo 2005 Vettori. Abbiamo visto L’uso di Vector come alternativa all’uso di arrays Rivediamo l’esercizio dell’altra volta.
Esercitazione del 7 marzo 2008 Ereditarieta’. Esercizio: soluzione Implementare la seguente specifica che definisce un tipo di dato Libro.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
1 Laboratorio di Introduzione alla Programmazione §II MODULO §3 crediti §Esame e voto unico (su 6 crediti totali)
LIP: 22 Marzo 2005 Eccezioni. Eccezioni-Richiami Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Cose nuove di Java (prima a chiacchiera, poi formalmente)
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Esercitazione. Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili.
1 Laboratorio di Introduzione alla Programmazione §II MODULO §3 crediti §Esame e voto unico (su 6 crediti totali)
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
Ese 1 e 3 (del 6 Aprile 2005). Primo Ese Si identifichino gli errori che il compilatore segnalerebbe per il seguente programma Tipi Legami tra dichiarazioni.
Alcune Classi Standard Object, Vettori. Ereditarieta’ Abbiamo visto come tramite l’ereditarieta’ e’ possibile estendere classi esistenti -arricchendo.
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 14 Marzo Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
LIP: 18 Aprile 2008 Interfacce. Rappresentazione Lista val next vuota Lista vuota: any true Lista non vuota: any true 154 false 24 false.
Ex.1 - Astrazioni su Dati Si abbia il tipo di dato stack di interi, IntStack, specificato sotto: public class IntStack { \\ OVERVIEW: uno Stack è una collezione.
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Transcript della presentazione:

Esercitazione del 9 marzo 2007 Ereditarieta’

Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio di Sostituzione

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’

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

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

Superclasse Persona Sia dia l’implementazione della seguente classe Persona

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 } }

Implementazione Variabili d’istanza private Attenzione al metodo equals, deve confrontare lo stato interno dei due oggetti e non il riferimento

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)

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 }

Cosa fare? Progettare la specifica della classe: intestazione classe=====> costruttori + metodi + descrizione informale

Dopo la specifica Scegliere le variabili d’istanza adatte a rappresentare lo stato interno Implementare i metodi di conseguenza

Attenzione: specifica Deve contenere costruttori e metodi aggiuntivi rispetto alla superclasse Deve contenere i metodi overridden (se necessario)

Metodi d’istanza Quali metodi devono essere ereditati? Quali devono essere sovrascritti?

Metodi Ereditati I public String getNome() { //EFFECTS: restituisce il nome di this } public String getIndirizzo() { //EFFECTS: restituisce l’indirizzo di this } FUNZIONANO CORRETTAMENTE!

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

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

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

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’????

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

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

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; ……………………. }

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

Problema Variabili della superclasse sono private Bisogna usare costruttori e metodi della superclasse (tramite super) Alternativa protected

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

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

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 }

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 }

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 } }

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)

Testing Archivio e’ definito per il supertipo Persona Puo’ memorizzare oggetti di un qualsiasi sottotipo (ex Persona)

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)

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?