1 Astrazioni polimorfe. 2 Perché il polimorfismo 4 Abbiamo visto come si definiscono insiemi di stringhe, insiemi di interi, insiemi di caratteri, etc.

Slides:



Advertisements
Presentazioni simili
Astrazioni Polimorfe e Tipi Generici. 2 Polimorfismo Dal Greco molte forme Una variabile polimorfa può riferirsi a oggetti di classi diverse Un metodo.
Advertisements

Informatica 2 Lezione 4 Corso di laurea in matematica Informatica 2 Dott. Ing. Leonardo Vito Corso di laurea matematica indirizzo matematica per le applicazioni.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
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.
Metodologie di Programmazione = decomposizione basata su astrazioni
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.
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
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 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Astrazione procedurale ed eccezioni
Polimorfismo Significato Significato Varie famiglie Varie famiglie Polimorfismo in java Polimorfismo in java Polimorfismo di Sottotipo: Apparato in Java.
1 Un esempio con iteratore: le liste ordinate di interi.
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.
Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
1 Astrazioni polimorfe. 2 Perché il polimorfismo 4 non vogliamo definire versioni differenti dell’astrazione corrispondente ad una collezione di elementi.
Astrazione di dati Esercizio 1. Si completi l’implementazione Poly.add data a lezione con la specifica e l’implementazione degli ausiliari min e max data.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
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.
Liste di Interi Esercitazione. IntList Lista di interi Problema tipico: memorizzare una sequenza di valori [6,0,9,3….9] Vediamo un tipo di dato utile.
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)
1 Astrazione sul controllo: gli iteratori. 2 Gli iteratori 4 perché vogliamo iterarare “in modo astratto” 4 iteratori e generatori in Java –specifica.
LIP: 9 Maggio Esercizi Riprendiamo un esercizio proposto Definire un tipo di dato Persona che definisce oggetti che rappresentano le informazioni.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
1 Un esempio: le liste ordinate di interi. 2 Liste ordinate  OrderedIntList 4 lista ordinata di interi –modificabile.
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 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
LIP: 8 Marzo 2005 Vettori. Abbiamo visto L’uso di Vector come alternativa all’uso di arrays Rivediamo l’esercizio dell’altra volta.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
Ese 3 (del 31 Marzo 2004). Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare.
LIP: 22 Marzo 2005 Eccezioni. Eccezioni-Richiami Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Esercizio 3. Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare i commenti.
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
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.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
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.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Testing e debugging. 2 Validazione 4 vogliamo assicurarci che un programma funziona come vorremmo e scoprire perché non lo fa, se questo è il caso 4.
1 Metodologie di Programmazione = decomposizione basata su astrazioni.
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.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
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.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
Liste Concatenate 28 Marzo Avviso Martedi’ 4 Aprile: Verifica di LIP Per iscriversi (obbligatorio) inviare un e- mail entro venerdi’ 31 Marzo a.
1 Un esempio con iteratore: le liste ordinate di interi.
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.
Sommario cos’è un tipo di dato astratto astrazione tramite specifica:
Transcript della presentazione:

1 Astrazioni polimorfe

2 Perché il polimorfismo 4 Abbiamo visto come si definiscono insiemi di stringhe, insiemi di interi, insiemi di caratteri, etc. 4 Non sarebbe meglio definire un tipo piu’ generale Set che funziona per diversi tipi? 4 Si dice tipo polimorfo 4 un’astrazione di dato può essere polimorfa –rispetto al tipo degli elementi contenuti nei suoi oggetti 4 una procedura o un iteratore possono essere polimorfi –rispetto ai tipi di uno o piú dei loro argomenti

3 Polimorfismo “vero” 4 esistono tipi “parametrici” –parametri di tipo “tipo” –t set, t stack, –il parametro t può essere istanziato ad un tipo qualunque producendo una versione del tipo come int set o int stack stack 4 in Java non si può fare così –i tipi sono classi –le classi non hanno parametri 4 il polimorfismo si puo’ realizzare realizza con le gerarchie di tipo

4 Un tipo primitivo polimorfo  Il tipo di dato array è polimorfo (possiamo creare array di int, String etc.) int[] a =new int[4] Il tipo e’ un parametro Viene instanziato al momento della creazione

5 Un altro tipo primitivo: Vector  Puo’ contenere oggetti di qualsiasi tipo, sottotipo di Object 4 Non e’ un tipo polimorfo, e’ un tipo generico 4 Non si sceglie il tipo al momento della creazione 4 Non ho vincoli sui valori che inserisco, possono essere non omogenei

6 Un altro tipo primitivo: Vector  Si puo’ pero’ simulare un tipo polimorfo usando Vector  usando Object ed i sottotipi 4 garantendo per l’omogeneita’ (non vengano inseriti valori di sottotipi differenti di Object )

7 Scelta del supertipo in una astrazione polimorfa  molto spesso è sufficiente Object –come nel caso di Vector –i metodi dell’astrazione polimorfa devono poter essere definiti utilizzando soltanto i metodi di Object 4 talvolta è necessario utilizzare altri metodi –il supertipo è definito da una apposita interface che prevede tali metodi che definisce i reali vincoli sul tipo degli elementi 4 Come vedremo esistono essenzialmente due modi di usare le interfacce

8 Astrazioni di dati polimorfe come collezioni di Object : Set  astraiamo in IntSet dal tipo degli elementi  specifica simile a quella di IntSet –i metodi accettano oggetti come argomenti e restituiscono oggetti 4 l’overview ci dice che –per confrontare oggetti i metodi usano il metodo equals –l’oggetto null non è mai contenuto in this

9 La specifica di Set public class Set { // OVERVIEW: un Set è un insieme modificabile di //Objects con un numero qualunque // di elementi; null non può mai essere elemento //di un Set. Si usa equals per // determinare l’uguaglianza degli elementi

10 La specifica di Set // costruttori public Set (){ // EFFECTS: inizializza this all’insieme vuoto} // metodi public void insert (Object x) throws NullPointerException{ // MODIFIES: this // EFFECTS: se x è null solleva //NullPointerException, altrimenti // aggiunge x agli elementi di this} public void remove (Object x) { // MODIFIES: this // EFFECTS: se x è in this lo rimuove, //altrimenti non fa nulla }

11 La specifica di Set public boolean isIn (Object x){ // EFFECTS: ritorna true se x appartiene a //this, altrimenti ritorna false } public boolean subset (Set s){ // EFFECTS: ritorna true se tutti gli elementi //di this appartengono a s, // altrimenti ritorna false} // specifica di size e elements analoghe }

12 Implementazione Parziale di Set public class Set { private Vector els; public Set ( ) { els = new Vector( ); } public void insert (Object x) throws NuIlPointerException { if (x==null) throw new NullPointerException(“Set.insert”); if (getIndex(x) < 0) els.add(x); } private int getIndex (Object x) { for (int i = 0; i < els.size(); i++) if (x.equals(els.get(i))) return i; return -1; } ……… } Nota: il confronto e’ realizzato da equals si astrae dal tipo degli elementi e dalla relativa nozione di uguaglianza

13 Funzione di astrazione ed invariante di rappresentazione 4 simili a quelle di IntSet 4 la funzione di astrazione  (c) = { c.els.get(i) | 0 <= i < c.els.size() } 4 il rep invariant include la condizione che l’insieme non contenga null e dice anche che l’uguaglianza degli elementi è controllata dal metodo equals I(c) = c.els != null e per ogni intero i, tale che 0<=i<c.els.size()) c.els.get(i) non è null, e per tutti gli interi i,j, tali che 0 <= i < j < c. els.size(), ! c.els.get(i).equals(c.els.get(j))

14 Utilizzazione delle astrazioni polimorfe 4 nella collezione possono essere messi solo oggetti –i valori primitivi devono essere avviluppati nel loro corrispondente tipo oggetto 4 osservatori che restituiscono elementi della collezione restituiscono Object –occorrerà usare il casting al valore primitivo Set s = new Set(); //ci mettiamo Integer s.insert(new Integer(3)); Iterator g = s.elements(); while (g.hasNext()) { int i = ((Integer) g.next()).intValue(); }

15 Problema 4 La collezione definita non ha per costruzione elementi omogenei Set s = new Set(); s.insert(new Integer(3)); s.insert(“pippo”);

16 4 diversi modi di fare insiemi (omogenei) di interi –la classe IntSet i metodi prendono come argomenti e ritornano solo interi il tutto è controllato staticamente dal compilatore –inserendo solo Integer s nella classe Set Chi lo usa deve fare il casting e controllare che la collezione sia omogenea il compilatore non può aiutare gli “errori di tipo” si rilevano come Eccezioni di Cast a tempo di esecuzione (ClassCastException) Insiemi polimorfi omogenei

17 Altro modo….. 4 Si può forzare la condizione di omogeneità –modificando la specifica –confrontando il tipo di ogni elemento al momento dell’inserimento e sollevando una eccezione se la struttura dati non e’ uniforme

18 La specifica di Set (omogenei) public class Set { OVERVIEW: un Set è un insieme omogeneo modificabile di Objects. null non può mai essere elemento di un Set. Si usa equals per determinare l’uguaglianza degli elementi

19 La specifica di Set (omogenei) public Set (){ EFFECTS: inizializza this all’insieme vuoto} // metodi public void insert (Object x) throws NullPointerException, ClassCastException{ MODIFIES: this EFFECTS: se x è null solleva NullPointerException, se x non è omogeneo con gli elementi già contenuti in this solleva ClassCastException, altrimenti aggiunge x agli elementi di this}

20 La specifica di Set (omogenei) public void remove (Object x){ // MODIFIES: this // EFFECTS: se x è in this lo rimuove, altrimenti non fa nulla} public boolean isIn (Object x){ // EFFECTS: ritorna true se x appartiene a this, altrimenti ritorna false } // specifica di size e elements }

21 Come si implementa? –aggiungendo una variabile di tipo Class che memorizza il tipo degli elementi dell’insieme –confrontando il tipo di ogni elemento inserito –il tipo di un oggetto si trova usando getClass()

22 Implementazione di Set public class Set { private Vector els; private Class type; private int sz; public Set ( ) { els = new Vector( ); sz=0;} public void insert (Object x) throws NullPointerException, ClassCastException{ if (x==null) throw NullPointerException(“Set.insert”); if (sz=0) {type=x.getClass();els.add(x);} else if (! type.isinstance(x)) throw new ClassCastException(“tipi non omogenei”); if (getIndex(x) < 0) els.add(x); sz++;} // gli altri metodi sono come prima }

23 Funzione di astrazione ed invariante 4 La funzione di astrazione rimane uguale 4 Nell’invariante dobbiamo aggiungere la condizione sulla omogeneita’ dei tipi se c.sz>0 allora c.type!=null e per tutti gli interi i, tali che 0 <= i < c. els.size(), c.type.isinstance(c.els.get(i))

24 Commenti 4 Il tipo viene istanziato quando e’ vuoto e si inserisce un elemento (tramite getClass) 4 Un insieme che si svuota puo’ cambiare tipo 4 Soluzione alternativa: il tipo viene istanziato al momento della creazione public Set (Class c ) { els = new Vector( );sz=0; type=c;}

25 Vantaggio: stile di programmazione piu’ robusta –Errori (eccezioni) a tempo di esecuzione comunque –La verifica della omogeneita’ e’ garantita per costruzione dal tipo di dato (e non demandata a chi lo usa) –Chi lo usa e’ informato tramite le eccezioni degli errori di tipo

26 Limiti dell’approccio 4 Per il tipo Set e molti altri tipi di dato polimorfi e’ sufficiente usare Object come supertipo 4 in alcuni casi servono pero’ delle operazioni aggiuntive –supponiamo di voler definire un tipo OrderedList versione polimorfa di OrderedIntList –abbiamo bisogno di ordinare gli elementi Object non ha associata nessuna relazione di ordinamento

27 Interfacce nell’approccio element subtype 4 ci serve un supertipo i cui sottotipi abbiano tutti un metodo per il confronto (relazione di ordinamento totale) 4 Vogliamo essere parametrici nel tipo degli elementi e nella relativa nozione di ordinamento 4 Questo tipo esiste e si chiama Comparable Interfaccia definito in java.util

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

29 Sottotipi di Comparable ed eccezioni 4 nell’implementazione di CompareTo in tutte le classi che implementano Comparable, bisogna analizzare un po’ di casi eccezionali –l’argomento è null –l’argomento ha un tipo che non è un sottotipo di Comparable –l’argomento ha un tipo che è un sottotipo di Comparable, ma il tipo di this e quello dell’argomento sono incompatibili tra loro sia Integer che String sono sottotipi di Comparable x.compareTo(s), con x Integer e s String non ha senso 4 in tutti questi casi, salvo il primo, compareTo deve sollevare ClassCastException

30 La classe OrderedList 4 Usiamo Comparable 4 specifica e implementazione simili a quelle di OrderedIntList –argomenti e risultati sono Comparable invece che int –il confronto è fatto usando compareTo 4 OrderedList assicura che gli elementi della lista siano omogenei –Si sfutta il fatto che compareTo solleva un’eccezione se gli oggetti non sono confrontabili 4 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 4 il metodo addEl assicura che il primo elemento sia comparabile

31 OrderedList 1 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 loro //metodo compareTo private boolean empty; private OrderedList next; private Comparable val; public OrderedList ( ) // EFFECTS: inizializza this alla lista ordinata vuota { empty = true; }

32 OrderedList 2 public void addEl (Comparable el) throw 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 {if el == null) throw new NullPointerException("OrderedList.addEl”); if (empty) { val=el;next=new OrderedList(); empty= false; return; } int n = el.compareTo(val); if (n = 0) throw new DuplicateException("OrderedList.addEl"); if (n > 0) {next.addEl(el) ; } else {OrderedList n=new OrderedList(); n.val=val;n.empty=empty; n.next=next; val=el; next=n;} – compareTo solleva l’eccezione se non sono omogenei

33 Specifica e implementazione di OrderedList 3 // altri metodi public void remEl (Comparable el) throws NotFoundException // MODIFIES: this // EFFECTS: se el non è in this, solleva NotFoundException; // altrimenti, rimuove el da this public boolean isIn (Comparable el) // EFFECTS: se el è in this ritorna true altrimenti ritorna false } –Gli altri metodi sono simili a quelli visti, solo che il confronto è fatto usando compareTo

34 Invariante e funzione di astrazione 4 Funzione di astrazione: uguale 4 Invariante: vanno aggiunte condizioni che garantiscano l’omogeneita’ e l’ordinamento (def. Ricorsiva)

35 I(c) = c.empty=true o c.val!=null e c.next ! =null e I (c.next) e se c.next.empty=false =====> c.val.compareTo(c.next.val) <0 L’invariante garantisce (tramite compareTo) le proprieta’ richieste: omogeneita’ ed ordinamento

36 Interfacce nell’approccio related subtype 4 Il tipo OrderedList puo’ essere usato per realizzare una lista ordinata di un qualunque sottotipo di Comparable 4 Esempio: tipi primitivi, Integer, String 4 Qualsiasi altro tipo definito da noi come implementazioni dell’interfaccia, implementando il metodo compareTo Esempio: Abbonato (LIP)

37 Interfacce 4 L’interfaccia Comparable (primitiva) permette di astrarre da una operazione specifica: l’ordinamento 4 Se ci servissero altre operazioni? Somma, Prodotto 4 L’ approccio puo’ essere generalizzato, –realizzando una interfaccia che definisce le proprietà e le operazioni del tipo polimorfo –implementando gli oggetti tramite sottotipi di tale interfaccia

38 Interfacce nell’approccio related subtype 4 Svantaggio dell’approccio element subtype: data l’ interfaccia con le operazioni che ci servono –I sottotipi devono essere definiti a priori come implementazioni dell’interfaccia Esempio: tipo di dato Abbonato Abbiamo dovuto modificarlo (definendolo come implementazione di Comparable)

39 Interfacce nell’approccio related subtype Questo suggerisce un approccio alternativo related subtype –per ogni tipo di elementi “preesistente”, definiamo un opportuno sottotipo dell’interfaccia “a posteriori” –definiamo un’interfaccia i cui oggetti hanno i metodi richiesti –gli oggetti non sono istanze di sottotipi dell’interfaccia –ma possiedono un sottotipo dell’interfaccia relativo

40 Esempio –supponiamo di voler definire un insieme (polimorfo) che mantiene l’informazione sulla somma degli elementi per far questo il tipo polimorfo deve utilizzare delle operazioni di somma e sottrazione che dipendono dal tipo degli elementi Esempio: somma tra interi, somma di polinomi etc.

41 Esempio 4 nell’approccio element subtype –dobbiamo definire un’interfaccia Addable, che ha due operazioni per sommare e sottrarre –dobbiamo definire una versione di Set, che ha elementi di tipo Addable e calcola la somma in modo parametrico –Per memorizzare in Set un certo tipo dobbiamo definirlo come sottotipo dell’interfaccia –Per esempio: modificare la def. di Poly in modo che implementi Addable e di conseguenza le op. di somma e sottrazione

42 Esempio 4 nell’approccio related subtype –possiamo definire un’interfaccia Adder, che ha due operazioni per sommare e sottrarre –per ogni tipo (anche) preesistente possiamo definire le operazioni di somma e sottrazione a posteriori –definendo un relativo sottotipo di Adder

43 L’interfaccia Adder public interface Adder { // OVERVIEW: tutti i sottotipi di Adder forniscono metodi per // sommare e sottrarre gli elementi di un “tipo collegato” public Object add (Object x, Object y) throws NullPointerException, ClassCastException; // EFFECTS: se uno tra x o y è null, solleva // NullPointerException; se x e y non sono sommabili solleva // ClassCastException; altrimenti ritorna la somma di x e y public Object sub (Object x, Object y) throws NullPointerException, ClassCastException; // EFFECTS: se uno tra x o y è null, solleva // NullPointerException; se x e y non sono sommabili solleva // ClassCastException; altrimenti ritorna la differenza tra x e y public Object zero ( ); // EFFECTS: ritorna l’oggetto che rappresenta lo zero per il // tipo collegato }

44 Sottotipi di Adder –abbiamo definito un’interfaccia Adder i cui oggetti hanno i metodi richiesti –ci interessa mettere nell’insieme oggetti di tipo Poly, non e’ un sottotipo dell’interfaccia (Poly non implementa Adder, e’ stato definito a priori) –definiamo invece a posteriori un sottotipo di Adder collegato a Poly che ha le operazioni per sommare e sottrarre Poly

45 Il sottotipo di Adder collegato a Poly public class PolyAdder implements Adder { private Poly z; // il Poly zero public PolyAdder ( ) {z = new Poly(); } public Object add (Object x, Object y) throws NullPointerException, ClassCastException { if (x == null || y == null) throw new NullPointerException ("PolyAdder.add"); return ((Poly) x).add((Poly) y); }  Il sottotipo chiama le operazioni di somma e sottrazione tra Poly  Tramite il cast se x o y non sono Poly viene sollevata un’eccezione

46 Il sottotipo di Adder collegato a Poly public Object sub (Object x, Object y) throws NullPointerException, ClassCastException { if (x == null || y == null) throw new NullPointerException ("PolyAdder.sub"); return ((Poly) x).sub((Poly) y); } public Object zero ( ) { return z; } }

47 Analogamente  si può definire un sottotipo di Adder collegato ad un tipo primitivo Integer  IntegerAdder aggiunge e sottrae Integer –Facile da realizzare usando le relative operazioni su int

48 Il tipo SumSet 4 Facciamo quindi vedere la versione polimorfa dell’insieme che mantiene la somma degli elementi  Usa Adder per essere parametrico nell’operazione da usare  il tipo degli elementi dell’insieme è determinato quando viene creato l’insieme mediante l’oggetto Adder che è un argomento del costruttore –L’uso di Adder garantisce che siano omogenei

49 Specifica e implementazione di SumSet 1 public class SumSet { // OVERVIEW: un SumSet è un insieme modificabile di oggetti //omogenei che mantiene la somma degli elementi //nell’insieme. La somma è calcolata usando un oggetto //Adder. private Vector els; // gli elementi private Object s; // la somma degli elementi private Adder a; // l’oggetto usato per fare i conti // costruttore public SumSet (Adder p) throws NullPointerException // EFFECTS: this diventa l’insieme vuoto di elementi del tipo // collegato a p, valore iniziale della somma = p.zero() { els =new Vector( ); a = p; s = p.zero ( ); }

50 Specifica e implementazione di SumSet 2 public void insert (Object x) throws NullPointerException, ClassCastException // MODIFIES: this // EFFECTS: se x è null solleva NullPointerException, se x // non è sommabile agli altri elementi di this, solleva // ClassCastException; altrimenti aggiunge x a this e // ricalcola la somma { Object z = a.add(s, x); int i = getIndex(x); if (i < 0) { els.add(x); s = z; } } Il metodo add (di Adder) solleva l’eccezione se non e’ di tipo omogeneo!!

51 Specifica e implementazione di SumSet 2 public Object sum = ( ) // EFFECTS: ritorna la somma degli elementi di this { return s; } } Gli altri metodi sono simili a prima, in remove si usa il metodo sub di Adder per mantenere aggiornata la somma

52 Utilizzazione di SumSet  Per usare SumSet per un tipo T bisogna creare il sottotipo dell’interfaccia Adder relativo a T (si puo’ fare a posteriori)  Se instanziato con IntegerAdder fa la somma tra interi  Se instanziato con PolyAdder fa la somma tra polinomi

53 Esempio di SumSet Adder a = new PolyAdder ( ); SumSet s = new Sumset (a); s.insert(new Poly(3, 7)); s.insert(new Poly(4, 8)); Poly p = (Poly) s.sum ( ); 4 Se cercassi di inserire un Integer mi darebbe errore di Cast 4 Sono omogenei

54 Procedure polimorfe 4 stesse tecniche anche per rendere polimorfa l’astrazione procedurale 4 si astrae dal tipo dei parametri formali 4 per l’implementazione, stesse possibilità dell’astrazione sui dati –utilizza solo i metodi che tutti gli oggetti hanno, cioè quelli definiti da Object –usa un’interfaccia supertipo del tipo dei parametri (element subtype) supertipo di un tipo collegato al tipo dei parametri (related subtype)

55 Due sort polimorfi  due metodi (specifiche solo!) sort che ordinano vettori –la prima funziona se gli elementi del vettore appartengono a sottotipi di Comparable –la seconda prende come argomento un Comparator (è definita per tipi per i quali esiste un related subtype di Comparator) public static sort (Vector v) throws ClassCastException // MODIFIES: v // EFFECTS: se v non è null, lo ordina in modo crescente usando // il metodo compareTo di Comparable; se alcuni elementi di v sono // null o non confrontabili solleva ClassCastException public static sort (Vector v, Comparator c) throws ClassCastException // MODIFIES: v // EFFECTS: se v non è null, lo ordina in modo crescente usando // il metodo compare di c; se alcuni elementi di v sono // null o non confrontabili solleva ClassCastException

56 public interface Comparator { public int compare (Object x, Object y) throws ClassCastException, NullPointerException; // EFFECTS: se x o y è null, lancia NullPointerException; // se x e y non sono confrontabili, solleva ClassCastException; // altrimenti, se x è minore di y ritorna -1; // se x = y ritorna 0; se x è maggiore di y, ritorna 1 } Comparator

57 Conclusioni  Il supertipo molto spesso è Object 4 talvolta è necessario utilizzare altri metodi –il supertipo è definito da una apposita interface che prevede tali metodi che definisce i reali vincoli sul tipo degli elementi 4 nell’approccio più comune (element subtype) –gli elementi sono sottotipi di tale interface 4 Nell’ approccio alternativo (related subtype) –bisogna definire un sottotipo dell’interface per ogni tipo potenziale di elementi (meno conveniente, ma si può fare dopo avere definito i tipi)

58 Ultime versioni di Java 4 Esistono modi piu’ sofisticati per realizzare il polimorfismo: tipi generici 4 Sono realizzati con tecniche simili a quelle viste 4 Comprendere i meccanismi di base permettera’ di capire come funzionano e come si usano (forse LSD)