Progettazione dei Sistemi Interattivi (A.A. 2004/05) - Lezione 4 1 Sulla realizzazione dellereditarietà 4 Ereditarietà: statica / dinamica 4 Binding: statico / dinamico 4 Attribuzione dei tipi: statica / dinamica
Progettazione dei Sistemi Interattivi (A.A. 2004/05) - Lezione 4 2 Attribuzione dei tipi Attribuzione dei tipi statica: le variabili, i parametri formali, il risultato dei metodi, sono tipati Il compilatore può verificare a priori se lo scambio dei messaggi e laccesso alle variabili sono validi e consistenti Attribuzione dei tipi dinamica: il compilatore ammette a priori tutti gli scambi di messaggi e tutti gli accessi alle variabili - La loro validità viene verificata solo a run-time
Progettazione dei Sistemi Interattivi (A.A. 2004/05) - Lezione 4 3 Designazione delloggetto ricevente: self e super Supponiamo di aggiungere un metodo prezzoTotale alla classe ARTICOLO,Calcolato come prezzoIva + prezzoTrasporto PROBLEMA: il prezzoIva di un articolo di lusso è calcolato diversamente dal prezzoIva di un articolo normale. Il metodo prezzoTotale deve quindi prevedere un trattamento differenziato se applicato ad articoli della sottoclasse ARTICOLO_LUSSO
Progettazione dei Sistemi Interattivi (A.A. 2004/05) - Lezione 4 4 Designazione delloggetto ricevente: self e super (cont.) Soluzione: uso della variabile speciale self: è un riferimento allo stesso oggetto che esegue prezzoTotale prezzoTotale (): return (send (self, prezzoIva) + send (self, prezzoTrasporto))
Progettazione dei Sistemi Interattivi (A.A. 2004/05) - Lezione 4 5 Esempio: uso di self Loggetto cav, istanza della classe CAVIALE, riceve il messaggio: send (cav, prezzoTotale) Esegue quindi il metodo prezzoTotale della classe ARTICOLO, che gli rimanda i messaggi: send (cav, prezzoIva) e send (cav, prezzoTrasporto) A questo punto cav esegue correttamente i metodi prezzoIva e prezzoTotale della classe ARTICOLO_LUSSO, come richiesto OSSERVAZIONE: notare lutilità del binding dinamico
Progettazione dei Sistemi Interattivi (A.A. 2004/05) - Lezione 4 6 La variabile speciale super Supponiamo che il metodo prezzoTrasporto della classe ARTICOLO_LUSSO sia una specializzazione del corrispondente metodo della superclasse ARTICOLO, e che anche la sottoclasse ARTICOLO_DEPERIBILE specializzi lo stesso metodo, ma in maniera differente: ARTICOLO prezzoTrasporto(): return (0,05 x prezzo) ARTICOLO_LUSSO prezzoTrasporto(): return (0,06 x prezzo) ARTICOLO_DEPERIBILE prezzoTrasporto(): return ( ,05 x prezzo) CAVIALEUOVA
Progettazione dei Sistemi Interattivi (A.A. 2004/05) - Lezione 4 7 La variabile speciale super (continua) Il metodo prezzoTrasporto può essere scritto in entrambe le sottoclassi Utilizzando il metodo corrispondente della superclasse nel modo seguente: in ARTICOLO_LUSSO: prezzoTrasporto (): return (1,2 x send (super, prezzoTrasporto)) in ARTICOLO_DEPERIBILE: prezzoTrasporto (): return ( send (super, prezzoTrasporto)) Con la variabile speciale super, il messaggio è inviato allo stesso oggetto, come con self, ma la ricerca del metodo da eseguire viene fatta nella superclasse
Progettazione dei Sistemi Interattivi (A.A. 2004/05) - Lezione 4 8 Realizzazione di super PROBLEMA (soluzione dei conflitti): sia ob loggetto ricevente un messaggio con selettore sel, e sia C la superclasse di ob che contiene il metodo da eseguire. Se questo metodo fa riferimento a super, in quale classe va cercato il supermetodo? Soluzione 1: viene scelto il primo metodo di selettore sel incontrato al di sopra della classe C, nella lista di priorità di C Soluzione 2: viene scelto il primo metodo di selettore sel incontrato al di sopra della classe C, nella lista di priorità di ob
Progettazione dei Sistemi Interattivi (A.A. 2004/05) - Lezione 4 9 Fusione e composizione di oggetti ARTICOLO ELETTRODOMESTICOARTICOLO_LUSSO TELEVISORE Ereditarietà multipla Costruzione di classi per fusione di oggetti Concettualmente corretto: TELEVISORE è un ELETTRODOMESTICO ed è un ARTICOLO_LUSSO (relazione is_a)
Progettazione dei Sistemi Interattivi (A.A. 2004/05) - Lezione 4 10 Fusione e composizione di oggetti (continua) RUOTA CARROZZERIAMOTORE AUTOMOBILE Concettualmente scorretto: AUTOMOBILE non è una CARROZZERIA, né un MOTORE, né una RUOTA
Progettazione dei Sistemi Interattivi (A.A. 2004/05) - Lezione 4 11 Fusione e composizione di oggetti (continua) Per la composizione di oggetti esiste già un valido meccanismo disponibile: le variabili di istanza AUTOMOBILE carrozza : CARROZZERIA motore : MOTORE ruote_ant : RUOTA ruote_pos : RUOTA La classe AUTOMOBILE non eredita da CARROZZERIA, MOTORE, RUOTA, bensì possiede dei campi definiti di tali tipi (relazione has_a) NOTA: una classe può ereditare da unaltra una sola volta