220 likes | 362 Views
La relazione di ereditarietà. Punto di vista insiemistico: la relazione di ereditarietà descrive una inclusione tra insiemi x Î VESTITO ==> x Î ARTICOLO Punto di vista concettuale: la relazione di ereditarietà indica una specializzazione VESTITO è una sorta di ARTICOLO
E N D
La relazione di ereditarietà • Punto di vista insiemistico: la relazione di ereditarietà descrive una inclusione tra insiemix Î VESTITO ==> x Î ARTICOLO • Punto di vista concettuale: la relazione di ereditarietà indica una specializzazioneVESTITO è una sorta di ARTICOLO • La relazione di ereditarietà è comunque transitiva e determina una relazione d’ordine tra le classi (chiusura transitiva della ereditarietà) Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3
Grafo di ereditarietà di una classe Restrizione del grafo di ereditarietà completo alle solesuperclassi della classe considerata Grafo di ereditarietà dellaclasse ASPIRAPOLVERE Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3
Grafo di ereditarietà di una classe (continua) Grafo di ereditarietà dellaclasse TELEVISORE Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3
Proprietà della ereditarietà: uniformità • L’ereditarietà si applica a tuttele 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
Ereditarietà statica / dinamica • Ereditarietà statica: tutte le proprietà della superclasse • sono ricopiate nella sottoclasse al momento della creazione (VANTAGGIO: maggiore efficienza) • Ereditarietà dinamica: all’atto 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
Ereditarietà statica Il dizionario delle variabili di una classe viene fissato al momento della Creazione della classe • VANTAGGI: • Il formato dell’istanza è 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
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
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
I° caso: ereditarietà semplice Poiché ogni classe può avere al più una superclasse diretta, il grafo G(O1) siriduce ad una catena, che ovviamente non ha bisogno di essere linearizzata:la lista di priorità è banalmente trovata ARTICOLO VESTITO ELETTRODOMESTICO ARTICOLO_LUSSO ASPIRAPOLVERE TELEVISORE CAMICIA CAVIALE ARTICOLO G(telev) ARTICOLO_LUSSO Lista di priorità di telev:TELEVISORE < ARTICOLO_LUSSO < ARTICOLO TELEVISORE Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3
II° caso: ereditarietà multipla I grafo G(O1) rappresenta una relazione d’ordine parziale, in cui alcuni elementipossono essere inconfrontabili (es. ELETTRODOMESTICO e ARTICOLO_LUSSO). Per trovare la lista di priorità di O1, la relazione d’ordineparziale definita da G(O1) deve essere linearizzata per poter risolvere conflitti ARTICOLO VESTITO ELETTRODOMESTICO ARTICOLO_LUSSO TELEVISORE CAMICIA CAVIALE G(telev) ARTICOLO ELETTRODOMESTICO ARTICOLO_LUSSO TELEVISORE Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3
Conflitti nella ricerca di priorità prezzoIva() ARTICOLO prezzoIva() ELETTRODOMESTICO ARTICOLO_LUSSO TELEVISORE non c’è conflitto ARTICOLO prezzoIva() prezzoIva() ELETTRODOMESTICO ARTICOLO_LUSSO TELEVISORE c’è conflitto Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3
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
Selezione dei metodi (binding) send (telev, prezzoIva) Binding (legame): associazione fra selettore e metodo Binding statico: l’associazione 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: l’associazione avviene solo in fase di esecuzione (late binding) andando a cercare nella lista di priorità dell’istanza cui telev fa riferimento Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3
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 all’altro • Non si può appoggiare un disco di raggio maggiore su uno di raggio inferiore Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3
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
Fase di progettazione: individuare le classi estabilirne 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
Fase di progettazione: individuare le classi estabilirne 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
Fase di sviluppo: scrivere il codice cheimplementa 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
Fase di sviluppo: scrivere il codice cheimplementa 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
Fase di sviluppo: scrivere il codice cheimplementa 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
Fase di sviluppo: scrivere il codice cheimplementa 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
Fase di sviluppo: scrivere il codice cheimplementa 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); } } } Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3