170 likes | 282 Views
X. A. B. CLASSI ED EREDITARIETÀ. Come si è visto, è cruciale che la gerarchia rispecchi la realtà del mondo ma a volte ciò contraddice principi di efficienza Esempio: creare una classe che rappresenti i numeri reali e poi aggiungere una classe per i numeri complessi.
E N D
X A B CLASSI ED EREDITARIETÀ • Come si è visto, è cruciale che la gerarchia rispecchi la realtà del mondo • ma a volte ciò contraddice principi di efficienza Esempio: • creare una classe che rappresenti i numeri reali • e poi aggiungere una classe per i numeri complessi
REALI E COMPLESSI Una classe per i reali • dentro, un dato float • più vari metodi per le operazioni class Real { protected float val; public Real(float x) {val = x; } public Real sum(Real x){ return val + x.val;} ... } Real
REALI E COMPLESSI Approccio pragmatico: poiché un Complex è caratterizzato da due float (parte reale e immaginaria), deriviamo Complex da Real • è un approccio efficiente • riusiamo il float dei Realcome parte reale • aggiungiamo un nuovo float per la parte immaginaria • ma la realtà è fatta a rovescio!! Complex un sottinsieme di Real??? Real Complex
REALI E COMPLESSI Approccio pragmatico: poiché un Complex è caratterizzato da due float (parte reale e immaginaria), deriviamo Complex da Real Conseguenze: • si può assegnare un Complexa un Real, ma non viceversa • le compatibilità di tipo vanno tutte“a rovescio” rispetto alla realtà • è un modello assurdo! Real Complex
REALI E COMPLESSI Approccio concettualmente corretto: poiché un Complex è un soprainsieme dei Real, deriviamo Real da Complex • bisogna riprogettare anche Real • non è un approccio efficiente • ogni Real ha due float, ma uno (laparte immaginaria) è sempre zero • le operazioni sono fra Complex inutilmente complicate per i Real • ma modella correttamente la realtà Complex Real
Real Complex Complex Real REALI E COMPLESSI Possibile che non si possa coniugare: • l’efficienza del primo approc-cio (dal punto di vista imple-mentativo)... … con la correttezza del secondo (dal punto di vista concettuale) ?
Real Complex Complex Real REALI E COMPLESSI Bisognerebbe poter avere due gerarchie: • una per la parte implemen-tativa, che risponda a prin-cipi di efficienza... … e una per l’interfaccia esterna, che mantenga la correttezza concettuale.
Real Complex Complex Real REALI E COMPLESSI Bisognerebbe poter avere due gerarchie: • una per la parte implemen-tativa, che risponda a prin-cipi di efficienza... CLASSI … e una per l’interfaccia esterna, che mantenga la correttezza concettuale. INTERFACCE
INTERFACCE Una interfacciacostituisce una pura specifica di interazione • contiene solo dichiarazioni di metodi • ed eventualmente costanti • ma non variabili né definizioni di metodi public interface Icomplex { public Icomplex sum(Icomplex z); }
INTERFACCE Ia Una classepuò implementare una o più interfacce • le interfacce contengono dichiarazioni di metodi • la classe deve definire i metodidelle interfacce implementate public class complex implements Icomplex { public Icomplex sum(Icomplex z){…} } A
INTERFACCE Ia Una classepuò implementare una o più interfacce • le interfacce contengono dichiarazioni di metodi • la classeDEVEdefinire i metodidelle interfacce implementate public class complex implements Icomplex { public Icomplex sum(Icomplex z){…} } Se non lo fa, il compilatore Java segnala ERRORE A
GERARCHIE DI INTERFACCE Ia Le interfacce possono dare luogo a gerarchieproprio come le classi: public interface Ireal extends Icomplex {...} • è una gerarchia separatada quella delle classi • è slegata dagli aspetti implementativi • esprime le relazioni concettuali della realtà • guida il progetto del modello della realtà Ib
Object A B UN ALTRO ASPETTO In Java, l’ereditarietà fra classi può essere solo singola • una classe può ereditare da una sola superclasse Questo può essere limitativo in alcune circostanze • altri linguaggi supportano l’ereditarietà multipla • che però comporta non pochi problemi
A B C EREDITARIETÀ MULTIPLA Con l’ereditarietà multipla fra classi • la classe C unisce sia i dati di A sia quelli di B • che si fa con le omonimie? • come si distinguono? • la classe C unisce i metodi di A con quelli di B • e se ci sono definizioni doppie? • e nelle classi successive? Java non la supportafra classi...
Ia Ib Iab EREDITARIETÀ MULTIPLA … ma la supportafra interfacce • una interfaccia contiene solo dichiarazionidi metodi • non ha implementazioni nessun problema di colli-sione fra metodi omonimi • non ha variabili nessun problema di colli-sione fra dati omonimi È un potente strumento di modellizzazione
INTERFACCE E PROGETTO Le interfacce inducono un diverso modo di concepire il progetto • prima si definiscono le interfacce che ser-vono, e si stabiliscono le relazioni tra loro • la gerarchia delle interfacce riflettescelte di progetto (pulizia concettuale) • poi si creano le classi che implementano tali interfacce • la gerarchia delle classi riflette scelte implementative (efficienza ed efficacia)
INTERFACCE E PROGETTO Tale ruolo è così essenziale da portare a definire, a volte,interfacce vuote • non dichiarano funzionalità • fungono da marcatori per le classi che asseriscono di implementarle • esempi: Cloneable, Serializable • una classe che le implementa “parla” di sé • ad esempio, di essere clonabile, serializzabile.. • è una forma di auto-documentazione • sfrutta il compilatore per trovare incongruenze