La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

LIP: 9 Maggio 2006. Esercizi Riprendiamo un esercizio proposto Definire un tipo di dato Persona che definisce oggetti che rappresentano le informazioni.

Presentazioni simili


Presentazione sul tema: "LIP: 9 Maggio 2006. Esercizi Riprendiamo un esercizio proposto Definire un tipo di dato Persona che definisce oggetti che rappresentano le informazioni."— Transcript della presentazione:

1 LIP: 9 Maggio 2006

2 Esercizi Riprendiamo un esercizio proposto Definire un tipo di dato Persona che definisce oggetti che rappresentano le informazioni relative ad una persona, Nome (String), Data di Nascita (int), Indirizzo (String)

3 Specifica ed Implementazione public class Persona{ \\OVERVIEW\\OVERVIEW: una Persona memorizza informazioni relative al nome, data di nascita, indirizzo private String nome; private int data; private String ind; public Persona(String n, int x, String i){ \\EFFECTS\\EFFECTS: costruisce una nuova Persona con nome n, data di nascita x ed indirizzo i nome=n; data=x; ind=i; }

4 Metodi Osservatori public String getnome (){ \\EFFECTS\\EFFECTS: resituisce il nome di this return nome;} public int getdata (){ \\EFFECTS\\EFFECTS: resituisce la data di nascita di this return data;} public String getind (){ \\EFFECTS\\EFFECTS: restituisce l’indirizzo di this return ind;} NECESSARI per leggere i valori dei campi che descrivono persona pur mantenendo la rappresentazione mascherata

5 Specifica public String toString() (){ \\EFFECTS\\EFFECTS: restituisce una descrizione di this return “nome:” + nome + “data:” + data + “indirizzo:” + ind; } public boolean equals(Object o) (){ \\EFFECTS\\EFFECTS: se o non e’ di tipo Persona solleva ClassCastException, altrimenti restituisce true sse this ed o sono uguali Persona p =(Persona) o; if (nome.equals (p.nome) && data==p.data && ind.equals (p.ind)) {return true;} else {return false;}} public void change (String x){ \\MODIFIES:this \\EFFECTS\\EFFECTS: assegna a this il nuovo indirizzo x ind=x;} }

6 Sottotipi Definire la specifica e l’implementazione di due sottotipi di Persona Studente: aggiunge l’informazione sul numero di matricola (int) Professore: aggiunge l’informazione sul corso che insegna (String)

7 Specifica ed Implementazione Progettare la specifica: costruttore, metodi aggiuntivi, metodi sovrascritti Sfruttare la gerarchia cercando di riutilizzare il piu’ possibile il codice Non accedere alla rappresentazione della superclasse (non usare protected)

8 public class Studente extends Persona{ \\OVERVIEW\\OVERVIEW: uno Studente e’ un sottotipo di Persona che aggiunge informazioni sul numero di matricola private int matricola; Ogni Studente ha 4 variabili d’istanza, i metodi non possono pero’ accedere alle variabili eredidate Deve inizializzarle tramite i metodi della superclasse (super) Vantaggio: l’implementazione della sottoclasse e’ indipendente da quella della super private String nome; private int data; private String ind;

9 public Studente(String n, int x, String i, int m){ \\EFFECTS\\EFFECTS: costruisce un nuovo Studente con nome n, data di nascita x, indirizzo i e matricola m super(n,x,i); matricola=m;} \\ metodo nuovo public int getmatricola (){ \\EFFECTS\\EFFECTS: restituisce la matricola di this return matricola;} \\ metodi sovrascritti (necessario) public String toString() (){ \\EFFECTS\\EFFECTS: restituisce una descrizione di this return super.toString() + “matricola:” + matricola;} public boolean equals(Object o) (){ \\EFFECTS\\EFFECTS: se o non e’ di tipo Studente solleva ClassCastException, altrimenti restituisce true sse this ed o sono uguali Studente p =(Studente) o; if (super.equals(p) && matricola==p.matricola) {return true;} else {return false;}}

10 Seconda Parte Lista Ordinata di elementi di tipo Persona Permette di memorizzare sia elementi di tipo Studente che di tipo Professore (sia di qualsiasi altro sottotipo di Persona) Ordinamento: in ordine alfabetico, e quindi secondo la data di nascita Ex: (Andrea, 3) < (Pippo,1) (Andrea, 1) < (Andrea,3)

11 public class ListaP { // OVERVIEW: `e una lista modificabile //ordinata di oggetti sottotipo di Persona // Oggetto tipico [x1,..., xn] con xi < xj se i < j // Il confronto fra gli elementi e’ effettuato in base //all’ordinamento spiegato in precedenza private Persona val; private ListaP next; private boolean vuota; public ListP( ) { // EFFECTS: inizializza this alla lista ordinata vuota vuota=true; }

12 public void addEl (Persona el) throws NullPointerException, DuplicateException { // MODIFIES: this // EFFECTS: se el è in this, solleva DuplicateException; se el // è null solleva NuIlPointerException; altrimenti, aggiunge //el a this rispettando l’ordinamento if (el==null) throw new NullPointerException(); if (vuota) {val=el; vuota=false; next= new ListaP();} else {if (val.equals (el)) new DuplicateException(); int conf= val.getNome().compareTo(el.getNome()); if (conf==1 || ((conf==0) && val.getData() > = el.getData())) // se val precede el deve inserire il nuovo nodo in testa

13 { ListaP nodo=new ListaP(); nodo.val=val;nodo.vuota=vuota; nodo.next=next; val=el;next=nodo;} else {next.addEl(el); return;} }

14 public Persona first () throws EmptyException{ // EFFECTS: se this è vuoto solleva EmptyException, // altrimenti ritorna il minimo (primo) elemento di this if (vuota) {throw new EmptyException(“ListaP.first()”); return val;} public ListP rest () throws EmptyException{ // EFFECTS: se this è vuoto solleva EmptyException, //altrimenti ritorna la lista ottenuta da this togliendo // il primo elemento if (vuota) {throw new EmptyException(“ListaP.first()”); return next;} } public int size () { // EFFECTS: ritorna il numero di elementi di this if (vuota) {return 0;} return 1 + next.size(); }

15 public boolean isIn (String x) { // EFFECTS: restituisce true se una Persona con nome x // appare in this, false altrimenti if (vuota) {return false;} int conf= val.getNome().compareTo(x); if (conf==0) {return true;} if (conf==1) {return false;} else {return next.isIn(x);} } public String toString () { // EFFECTS: standard if (vuota) {return “”;} return val.toString() +next.toString();} }

16 public boolean equals (ListaP p) { // EFFECTS: restituisce true se this e p sono uguali if (size() != p.size()) {return false;} if (vuota && p.vuota) {return true;} if (! val.equals(p.val)) {return false;} else {return next.equals (p.next);} }

17 Liste Ordinate Abbiamo visto la realizzazione del tipo di dato astratto Lista Concatenata di Persona Vantaggio: puo’ essere usata per memorizzare elementi che sono sottotipi, es. Studente e Professore Svantaggio: l’ordinamento e’ fissato (quello definito per Persona) Potrebbe essere utile essere parametrici anche rispetto alla nozione di ordine

18 Esempio Per Studente si potrebbe usare un ordinamento diverso, in cui a parita’ di nome, gli oggetti vengano ordinati in base al numero di matricola Bisogna generalizzare il tipo di dato

19 Liste Ordinate Generiche Sarebbe meglio avere un tipo di dato OList piu’ generale che possa essere istanziato per un dato tipo Parametrico rispetto sia al tipo degli elementi che dell’ordinamento Vorrei poterlo usare per memorizzare Persona, suoi sottotipi, String, Integer Ognuno con il suo ordinamento

20 In Java Non esistono meccanismi diretti per fare il polimorfismo Si puo’ ottenere usando varie tecniche Oggi ne vedremo una che e’ basata sull’idea di usare l’ereditarieta’ ovvero i sottotipi per realizzare una lista polimorfa In particolare vedremo come le interfacce possano essere usate per realizzare una forma di lista generica ordinata

21 Per cominciare a capire Supponiamo di volere realizzare una lista generica In cui gli elementi sono ordinati in ordine crescente Deve essere parametrica sia nel tipo degli elementi che nel relativo ordinamento Per esempio: se istanziata con stringhe l’ordinamento sara’ quello lessicografico etc..

22 Per realizzare una lista generica potrei dire che ha elementi Object E’ facile modificare la specifica e l’implementazione che abbiamo visto Non sarebbe garantita l’omogeneita’, ovvero non sarebbe possibile istanziare la lista con un dato Tipo (tipo nel Vector) Inoltre in Object non esiste un metodo di ordinamento

23 Interfaccia Comparable (è definito in java.util) –Ha un solo metodo compareTo che serve per realizzare confronti –Tutti i sottotipi implementano il metodo compareTo –Fornisce un supertipo i cui sottotipi hanno tutti un metodo per il confronto (relazione di ordinamento totale)

24 L’interfaccia Comparable public interface Comparable { // OVERVIEW: i sottotipi di Comparable forniscono un metodo // per determinare la relazione di ordinamento fra i loro // oggetti; l’ordinamento deve essere totale e, ovviamente, // transitivo e simmetrico; infine // x. compareTo (y) == 0 implica x. equals (y) public int compareTo (Object x) throws ClassCastException, NullPointerException; // EFFECTS: se x è null, lancia NullPointerException; // se this e x non sono confrontabili, solleva ClassCastException; // altrimenti, se this è minore di x ritorna -1; // se this = x ritorna 0; se this è maggiore di x, ritorna 1 }

25 Nota Il metodo compareTo realizza l’ordinamento Se chiamato su oggetti che non sono omogenei (tipo String ed Integer) allora solleva ClassCastException

26 Uso di Comparable Facciamo una lista ordinata generica ed omogenea usando Comparable Gli elementi della lista sono di tipo Comparable (invece che Integer o String etc…) Il confronto e’ fatto in modo generico usando compareTo Questo permette di usare la lista per memorizzare qualsiasi sottotipo di Comparable Verra’ scelto l’ordinamento giusto in base al tipo degli elementi

27 Cosa cambia nella Specifica? Bisogna indicare che gli elementi sono Comparable –argomenti e risultati sono Comparable invece che int –bisogna indicare che gli elementi sono ordinati rispetto a compareTo OrderedList assicura che gli elementi della lista siano omogenei –Si sfutta il fatto che compareTo solleva un’eccezione se gli oggetti non sono confrontabili il tipo degli elementi nella lista è determinato dall’inserimento del primo elemento –se la lista diventa vuota il tipo può cambiare con l’aggiunta di un nuovo elemento

28 Specifica di OrderedList public class OrderedList { // OVERVIEW: `e una lista modificabile ordinata di // oggetti omogenei di tipo Comparable // Oggetto tipico [x1,..., xn] con xi < xj se i < j // Il confronto fra gli elementi è effettuato con il // metodo compareTo Nota: xi < xj significa rispetto a compareTo

29 Costruttori e Metodi public OrderedList ( ) { // EFFECTS: inizializza this alla lista ordinata vuota} public void addEl (Comparable el) throws NullPointerException, DuplicateException, ClassCastException { // MODIFIES: this // EFFECTS: se el è in this, solleva DuplicateException; se el //è null solleva NuIlPointerException; se el non è //confrontabile con gli altri elementi in this solleva //ClassCastException; altrimenti, aggiunge el a this} Nota: in questo caso aggiunge vuol dire che lo aggiunge in base all’ordinamento

30 Specifica public Comparable first () throws EmptyException{ // EFFECTS: se this è vuoto solleva EmptyException, //altrimenti ritorna il primo elemento di this} public OrderedList rest () throws EmptyException{ // EFFECTS: se this è vuoto solleva EmptyException, //altrimenti ritorna la lista ottenuta da this togliendo il primo elemento} public int size () { // EFFECTS: restituisce il numero di elementi di this} public boolean IsIn(Comparable c) { // EFFECTS: restituisce true se c compare in this, //false altrimenti} public String toString (){\\EFFECTS: standard} }

31 Testing Non esistono oggetti di tipo Comparable (interfaccia) Esistono oggetti che sono sottotipi di Comparable String,Integer (implementazioni dell’interfaccia)

32 Sottotipi di Comparable E se volessimo usarlo per memorizzare un sottotipo non primitivo? Es. Persona, Studente, Professore Vanno modificati, non sono sottotipi di Persona

33 public class Persona implements Comparable{ \\OVERVIEW\\OVERVIEW: una Persona e’ un sottotipo di Comparable, memorizza informazioni relative al nome, data di nascita, indirizzo ……..SPECIFICA ED IMPLEMENTAZIONE UGUALE A PRIMA + METODO EREDITATO DALL’INTERFACCIA public int compareTo (Object x) throws ClassCastException, NullPointerException{ // EFFECTS: se x è null, lancia NullPointerException; // se this e x non sono confrontabili, solleva ClassCastException; // altrimenti, se this è minore di x ritorna -1; // se this = x ritorna 0; se this è maggiore di x, ritorna 1}

34 A casa Riproggettare le classi Studente e Professore Dovranno sovrascrivere il metodo compareTo di Persona Per ogni sottotipo possiamo avere un ordinamento relativo, piu’ specifico


Scaricare ppt "LIP: 9 Maggio 2006. Esercizi Riprendiamo un esercizio proposto Definire un tipo di dato Persona che definisce oggetti che rappresentano le informazioni."

Presentazioni simili


Annunci Google