Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 1 La relazione di ereditarietà Punto di vista insiemistico: la relazione di ereditarietà descrive una inclusione tra insiemi x VESTITO ==> x ARTICOLO 4 Punto di vista concettuale: la relazione di ereditarietà indica una specializzazione VESTITO è una sorta di ARTICOLO 4 La relazione di ereditarietà è comunque transitiva e determina una relazione dordine tra le classi (chiusura transitiva della ereditarietà)
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 2 Grafo di ereditarietà di una classe Grafo di ereditarietà della classe ASPIRAPOLVERE Restrizione del grafo di ereditarietà completo alle sole superclassi della classe considerata
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 3 Grafo di ereditarietà di una classe (continua) Grafo di ereditarietà della classe TELEVISORE
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 4 Proprietà della ereditarietà: uniformità Lereditarietà si applica a tutte le proprietà della classe (non è possibile ereditare solo una parte dei campi e dei metodi) La relazione di ereditarietà è uniforme per tutti gli oggetti, senza eccezioni (non è possibile che alcuni oggetti ereditino proprietà da una superclasse mentre altri oggetti della stessa classe non ereditino dalla superclasse)
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 5 Ereditarietà statica / dinamica Ereditarietà statica: tutte le proprietà della superclasse sono ricopiate nella sottoclasse al momento della creazione (VANTAGGIO: maggiore efficienza) Ereditarietà dinamica: allatto della creazione non viene effettuata alcuna copia di proprietà, le quali rimangono nella sola superclasse e sono accessibili solo dinamicamente (VANTAGGIO: flessibilità e modificabilità locale)
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 6 Ereditarietà statica Il dizionario delle variabili di una classe viene fissato al momento della Creazione della classe VANTAGGI: Il formato dellistanza è fissato alla creazione della classe Gli indirizzi relativi della struttura fisica sono noti e restano invariati SVANTAGGIO: Stile di programmazione top-down
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 7 Ereditarietà dinamica Non viene eseguita alcuna copia del dizionario delle variabili e del dizionario dei metodi al momento della creazione della classe - Queste proprietà appartengono esclusivamente alla classe in cui sono definite VANTAGGI: Flessibilità: le proprietà ereditate possono evolvere senza coinvolgere nessuna altra classe che quella di appartenenza Il grafo di ereditarietà può essere modificato facilmente con interventi locali
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 8 Ricerca di proprietà PROBLEMA: dato un oggetto O1 della classe C1 e una proprietà p, trovare nel grafo di ereditarietà G(O1) di O1 la classe C2 da cui eredita p SCHEMA DI SOLUZIONE: linearizzare la gerarchia delle classi espressa in G(O1), ottenendo un ordine totale fra le classi (lista di priorità di O1) ricercare nella lista di priorità così ottenuta la prima occorrenza di p
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 9 I° caso: ereditarietà semplice Poiché ogni classe può avere al più una superclasse diretta, il grafo G(O1) si riduce ad una catena, che ovviamente non ha bisogno di essere linearizzata: la lista di priorità è banalmente trovata ARTICOLO ELETTRODOMESTICOARTICOLO_LUSSO VESTITO ASPIRAPOLVERETELEVISORE CAVIALE CAMICIA G(telev) ARTICOLO ARTICOLO_LUSSO TELEVISORE Lista di priorità di telev: TELEVISORE < ARTICOLO_LUSSO < ARTICOLO
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 10 II° caso: ereditarietà multipla I grafo G(O1) rappresenta una relazione dordine parziale, in cui alcuni elementi possono essere inconfrontabili (es. ELETTRODOMESTICO e ARTICOLO_LUSSO). Per trovare la lista di priorità di O1, la relazione dordine parziale definita da G(O1) deve essere linearizzata per poter risolvere conflitti ARTICOLO ELETTRODOMESTICOARTICOLO_LUSSO VESTITO TELEVISORE CAVIALE CAMICIA G(telev) ARTICOLO ELETTRODOMESTICOARTICOLO_LUSSO TELEVISORE
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 11 Conflitti nella ricerca di priorità ARTICOLO ELETTRODOMESTICOARTICOLO_LUSSO TELEVISORE prezzoIva () non cè conflitto ARTICOLO ELETTRODOMESTICOARTICOLO_LUSSO TELEVISORE prezzoIva () cè conflitto
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 12 Soluzione dei conflitti Algoritmi per la linearizzazione (criteri euristici) Restrizioni: vietare i conflitti Usare la conoscenza del creatore del programma o di un esperto del campo di applicazione caso per caso ESEMPI JAVA consente solo ereditarietà semplice EIFFEL costringe il programmatore a rinominare le proprietà in conflitto
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 13 Selezione dei metodi (binding) send (telev, prezzoIva) Binding (legame): associazione fra selettore e metodo Binding statico: lassociazione tra il selettore e il metodo avviene in fase di compilazione (early binding), andando a cercare il metodo nella lista di priorità del riferimento telev Binding dinamico: lassociazione avviene solo in fase di esecuzione (late binding) andando a cercare nella lista di priorità dellistanza cui telev fa riferimento
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 14 Esercizio: La torre di Hanoi Problema: spostare n dischi dal piolo A al piolo B usando il piolo C come appoggio Regole: Si può spostare un solo disco alla volta da un piolo allaltro Non si può appoggiare un disco di raggio maggiore su uno di raggio inferiore
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 15 Fase di analisi: individuare i dati e i loro comportamenti Disco: oggetto passivo caratterizzato da un unico dato: il raggio Piolo: oggetto che detiene un numero variabile di dischi, aggiunge dischi in cima e toglie dischi dalla cima Solutore: oggetto che detiene tre pioli, e che facendo una giusta sequenza di mosse, risolve il problema
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 16 Fase di progettazione: individuare le classi e stabilirne le proprietà Class Piolo { CAMPI pila : Stack METODI add_disco (n) sfila_disco () } Class Stack { CAMPI stack : array[MAX] of Object top : Integer METODI push (ob) pop () top () vuoto () }
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 17 Fase di progettazione: individuare le classi e stabilirne le proprietà (continua) Class Hanoi { CAMPI pioloA : Piolo; pioloB : Piolo; pioloC : Piolo; METODI sposta_disco (p1, p2) Hanoi (n) risolvi (A, B, C, n) }
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 18 Fase di sviluppo: scrivere il codice che implementa le classi Class Piolo { Stack pila = new Stack; add_disco (int n) { if (pila.vuoto() || pila.top() > n) pila.push(n); else exit(1); } int sfila_disco () { int t; if (!pila.vuoto()) t = pila.top(); else exit(1); pila.pop(); return t; }
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 19 Fase di sviluppo: scrivere il codice che implementa le classi (continua) Class Stack { Object stack[MAX] = new Object[MAX]; int top = 0; push (Object ob) { if (top < MAX) { stack[top] = ob; top ++; } else exit(1); } pop () { if (top > 0) top --; else exit(1); }
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 20 Fase di sviluppo: scrivere il codice che implementa le classi (continua) Object top () { if (top > 0) return stack[top -1]; else exit(1); } boolean vuoto () { if (top < 1) return true; else return false; }
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 21 Fase di sviluppo: scrivere il codice che implementa le classi (continua) Class Hanoi { Piolo pioloA = new Piolo; Piolo pioloB = new Piolo; Piolo pioloC = new Piolo; sposta_disco (Piolo p1, Piolo p2) { int disco = p1.sfila_disco(); p2.add_disco(disco); // VISUALIZZA LO SPOSTAMENTO } Hanoi (int n) { int i; for (i = n; i > 0; i--) pioloA.add_disco(i); risolvi(pioloA, pioloB, pioloC, n); }
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 22 Fase di sviluppo: scrivere il codice che implementa le classi (continua) risolvi (Piolo A, Piolo B, Piolo C, int n) { if (n < 1) return; if (n == 1) sposta_disco(A, B); else { risolvi(A, C, B, n-1); sposta_disco(A, B); risolvi(C, B, A, n-1); }