10.07.2015 Views

Classi Astratte e Interfacce in Java

Classi Astratte e Interfacce in Java

Classi Astratte e Interfacce in Java

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Università degli Studi di Modena e Reggio EmiliaFacoltà di IngegneriaCORSO DIFONDAMENTI DI INFORMATICA IIL<strong>in</strong>guaggio <strong>Java</strong>: <strong>Classi</strong> <strong>Astratte</strong> e<strong>Interfacce</strong>Ing. Franco ZambonelliLucidi realizzati <strong>in</strong> collaborazione conIng. Enrico Denti - Univ. BolognaAnno Accademico 1999/2000Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 1CLASSI ASTRATTEL’ereditarietà porta a riflettere sul rapporto fra progetto estruttura.In particolare,• una classe può limitarsi a def<strong>in</strong>ire l’<strong>in</strong>terfaccia e le proprietàbase di una classe di entità...• ..lasciando “<strong>in</strong> bianco” alcune operazioni...• ...che verranno poi implementate dalle classi derivate.Una classe con queste caratteristiche:• fattorizza, dichiarandole, operazioni comuni a tutte le suesottoclassi, e def<strong>in</strong>isce dati comuni...• ... ma non def<strong>in</strong>isce (implementa) le operazioniQu<strong>in</strong>di...• di una classe siffatta è impossibile def<strong>in</strong>ire istanze, perchéesistono metodi lasciati <strong>in</strong> bianco” (a cui queste istanze nonsaprebbero come rispondere)↓È una CLASSE ASTRATTAUna classe astratta:• non viene creata per derivarne istanze...• ma per derivarne altre classi, che dettaglieranno(specificandole) le operazioni qui solo dichiarateFranco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 2


ESEMPIO: IL REGNO ANIMALETutti abbiamo un’idea di cosa sia un animale: <strong>in</strong> particolare• ogni animale ha un qualche verso• ogni animale si muove <strong>in</strong> qualche modo• ogni animale vive <strong>in</strong> un qualche ambiente (aria, acqua,terraferma...)...ma proprio per questo, non esiste “il generico animale”!Ogni animale reale:• ha uno specifico verso• si muove <strong>in</strong> uno specifico modo• vive <strong>in</strong> uno specifico ambienteAd esempio:• il leone ruggisce, si muove avanzando a quattro zampe,e vive sulla terraferma• la rana gracida, si muove saltando, e vive negli stagni• l’uomo parla, si muove camm<strong>in</strong>ando, e vive sulla terraAllora, perché <strong>in</strong>trodurre una tale classe “animali”?• appunto per fattorizzare aspetti comuni• che <strong>in</strong>ducono una classificazione degli oggetti del mondoIn effetti, non esistono neanche i pesci, i mammiferi, gli uccelli...... ma disporre di queste categorie concettuali è comunque utile!Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 3SPECIFICA DI CLASSI ASTRATTECome specificare una classe come “astratta” ?In <strong>Java</strong>, basta etichettare la classe come abstractESEMPIOpublic abstract class Animale {public abstract Str<strong>in</strong>g verso();public abstract Str<strong>in</strong>g si_muove();public abstract Str<strong>in</strong>g vive();}Il concetto così espresso è che• ogni animale “reale” può fare un verso, può muoversi, e puòdire <strong>in</strong> che ambiente vive• ma non si può, <strong>in</strong> generale, precisare come.NOTE• una classe avente anche solo un metodo abstract è astratta, edeve essere dichiarata abstract essa stessa (altrimenti si haerrore)• una classe astratta può però anche non avere metodi dichiaratiabstract (ma resta comunque astratta, e qu<strong>in</strong>di è impossibileistanziarla)• una sottoclasse di una classe astratta è anch’essa astratta, se nonridef<strong>in</strong>isce tutti i metodi che erano astratti nella classe base.Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 4


ESEMPIO: TASSONOMIA ANIMALEL’assunto alla base di questo esempio è che ogni animale“concreto” sia caratterizzato (compiutamente, almeno ai f<strong>in</strong>idell’esempio stesso) dalle due seguenti proprietà:• l’ambiente <strong>in</strong> cui vive;• il modo <strong>in</strong> cui si muove.IPOTIZZIAMO CHE:- ogni animale sappia rispondere a un messaggio, chi_sei(),che restituisce una breve descrizione dell’animale stesso;- tutti gli animali siano rappresentabili nello stesso modo(nel senso che esiste almeno un denom<strong>in</strong>atore comune alle lororappresentazioni)- ogni animale sappia rispondere al messaggio mostra(),la cui def<strong>in</strong>izione è <strong>in</strong>dipendente dallo specifico animale a cuisi applica, perché basata sugli altri metodi.Poiché ogni animale:• vive <strong>in</strong> un certo ambiente (ma quale ambiente dipende dallospecifico animale considerato)• si muove <strong>in</strong> un certo modo (ma come esattamente varia da casoa caso)i due metodi vive() e si_muove() hanno tutte le caratteristichedei metodi astrattiè opportuno che vengano dichiarati nella classe-base animale(perché tipici di ogni possibile animale reale)Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 5COSTRUTTORI E CLASSIASTRATTELa classe-base atratta deve avere un costruttore?Essendo astratta, forse non serve.... o <strong>in</strong>vece sì?RIFLESSIONE- le classi derivate che rappresentano animali concreti avrannosenz’altro un costruttore, che per prima cosa <strong>in</strong>vocherà uncostruttore della classe-base- se esiste anche solo un campo dati privato nella classe-base,per <strong>in</strong>izializzarlo servirà un costruttore della classe base, vistoche le classi derivate non ne hanno visibilità direttaNaturalmente, tale costruttore non sarà mai usato direttamente(perché non esisteranno mai istanze di “generici” animali), masarà chiamato dai costruttori delle classi derivate→ può essere public o anche solo protectedpublic abstract class Animale {private Str<strong>in</strong>g nome;protected Str<strong>in</strong>g verso;public Animale(Str<strong>in</strong>g s) { nome=s; }public abstract Str<strong>in</strong>g si_muove();public abstract Str<strong>in</strong>g vive();public abstract Str<strong>in</strong>g chi_sei();public void mostra() {System.out.pr<strong>in</strong>tln(nome + ", " + chi_sei() +", " + verso + ", si muove " +si_muove() + " e vive " + vive() ); } }Per procedere nella costruzione della tassonomia, occorre oradecidere i criteri con cui operare la classificazione.Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 6


CRITERI DI CLASSIFICAZIONE• <strong>in</strong> l<strong>in</strong>ea di pr<strong>in</strong>cipio, si possono pensare sottoclassi di animalicaratterizzati da un certo colore della pelle, dal metodo diriproduzione, o da qualunque altro criterio• ma queste scelte non sono, ora, le più naturali• <strong>in</strong>fatti, tipicamente i criteri di classificazione si basano sullecaratteristiche corrispondenti ai metodi astratti, perché sonoesattamente le proprietà ritenute rilevanti f<strong>in</strong> dallaprogettazione della classe-base↓Due “criteri naturali”:• l’ambiente <strong>in</strong> cui l’animale vive• il modo di muoversiScegliendo, per fare una prima ripartizione, il criterio dell’ambientedi vita, una possibile scelta può essere dist<strong>in</strong>guere fraANIMALEANIMALE_TERRESTRE ANIMALE_ACQUATICOanimali terrestri e animali acquatici.Queste due nuove sottoclassi sono ancora classi astratte:• <strong>in</strong>fatti, nulla è ancora stato detto sul movimento¡impossibile def<strong>in</strong>ire il metodo si_muove().Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 7LE PRIME DUE SOTTOCLASSI (astratte)public abstract class AnimaleTerrestreextends Animale {public AnimaleTerrestre(Str<strong>in</strong>g s) { super(s); }public Str<strong>in</strong>g vive() {return "sulla terraferma"; }public Str<strong>in</strong>g chi_sei() {return "un animale terrestre"; }}public abstract class AnimaleAcquaticoextends Animale {public AnimaleAcquatico(Str<strong>in</strong>g s) { super(s); }public Str<strong>in</strong>g vive() { return "nell'acqua"; }public Str<strong>in</strong>g chi_sei() {return "un animale acquatico"; }}Un’ulteriore classificazione (meno scontata della precedente)può portare a <strong>in</strong>trodurre la classe (ancora astratta) degli animalimar<strong>in</strong>i, come specializzazione degli animali acquatici.ANIMALEANIMALE_TERRESTRE ANIMALE_ACQUATICOANIMALE_MARINOIn questo caso il criterio usato non ha nulla a che fare con lecaratteristiche <strong>in</strong>izialmente evidenziate (ambiente di vita,movimento e, <strong>in</strong> misura m<strong>in</strong>ore, verso), ma rispecchiasemplicemente una suddivisione che esiste nella realtà.Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 8


La dichiarazione della nuova classe ha l’aspetto seguente:public abstract class AnimaleMar<strong>in</strong>oextends AnimaleAcquatico {public AnimaleMar<strong>in</strong>o(Str<strong>in</strong>g s) { super(s); }public Str<strong>in</strong>g vive() { return "<strong>in</strong> mare"; }public Str<strong>in</strong>g chi_sei() {return "un animale mar<strong>in</strong>o"; }}LA TASSONOMIA COMPLETALa tassonomia completa mette <strong>in</strong> gioco anche l’altro criterio“naturale”, quello relativo al movimento: su questa base, glianimali terrestri vengono suddivisi <strong>in</strong> quadrupedi, bipedi e uccelli.Ognuna di queste categorie dà la sua def<strong>in</strong>izione per il metodoANIMALEANIMALE_TERRESTRE ANIMALE_ACQUATICOQUADRUPEDE BIPEDE UCCELLOANIMALE_MARINOCAVALLOUOMOCORVO PINGUINOPESCE(di mare)EquusbirdTONNOHomoCrow Tweetytunsi_muove(), perciò queste classi rappresentano classi di animalireali (non più astratte), di cui si possono creare istanze.Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 9LE CLASSI “CONCRETE”public class PesceDiMare extends AnimaleMar<strong>in</strong>o {public PesceDiMare(Str<strong>in</strong>g s) { super(s);verso="non fa versi"; }public Str<strong>in</strong>g si_muove() { return "nuotando"; }public Str<strong>in</strong>g chi_sei() {return "un pesce (di mare)"; }}public class Uccello extends AnimaleTerrestre {public Uccello(Str<strong>in</strong>g s) { super(s);verso="c<strong>in</strong>guetta"; }public Str<strong>in</strong>g si_muove() { return "volando"; }public Str<strong>in</strong>g chi_sei() { return "un uccello";}public Str<strong>in</strong>g vive() {return "<strong>in</strong> un nido su un albero"; }}public class Bipede extends AnimaleTerrestre {public Bipede(Str<strong>in</strong>g s) { super(s); }public Str<strong>in</strong>g si_muove() {return "avanzando su 2 zampe"; }public Str<strong>in</strong>g chi_sei() {return "un animale con due zampe"; }}public class Quadrupede extends AnimaleTerrestre {public Quadrupede(Str<strong>in</strong>g s) { super(s); }public Str<strong>in</strong>g si_muove() {return "avanzando su 4 zampe"; }public Str<strong>in</strong>g chi_sei() {return "un animale con quattro zampe"; }}Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 10


ULTERIORI CLASSI PIÙ SPECIFICHE• l’uomo si muove sì “avanzando su due zampe”, ma più esattamente“camm<strong>in</strong>a su due gambe” → ridef<strong>in</strong>isce si_muove()• il p<strong>in</strong>gu<strong>in</strong>o, pur essendo un uccello (e <strong>in</strong> generale gli uccellivolano), non sa volare → ridef<strong>in</strong>isce si_muove()public class Cavallo extends Quadrupede {public Cavallo(Str<strong>in</strong>g s) { super(s);verso="nitrisce"; }public Str<strong>in</strong>g chi_sei() { return "un cavallo"; }}public class Uomo extends Bipede {public Uomo(Str<strong>in</strong>g s) { super(s);verso="parla"; }public Str<strong>in</strong>g si_muove() {return "camm<strong>in</strong>ando su 2 gambe"; }public Str<strong>in</strong>g chi_sei() {return "un homo sapiens"; }public Str<strong>in</strong>g vive() { return "<strong>in</strong> condom<strong>in</strong>io"; }}public class Corvo extends Uccello {public Corvo(Str<strong>in</strong>g s) { super(s);verso="gracchia"; }public Str<strong>in</strong>g chi_sei() { return "un corvo"; }}public class P<strong>in</strong>gu<strong>in</strong>o extends Uccello {public P<strong>in</strong>gu<strong>in</strong>o(Str<strong>in</strong>g s) { super(s);verso = "non fa versi"; }public Str<strong>in</strong>g chi_sei() { return "un p<strong>in</strong>gu<strong>in</strong>o";}public Str<strong>in</strong>g si_muove() {return "ma non sa volare"; }}Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 11ULTERIORI CLASSI PIÙ SPECIFICHE (segue)public class Tonno extends PesceDiMare {public Tonno(Str<strong>in</strong>g s) { super(s); }public Str<strong>in</strong>g chi_sei() { return "un tonno"; }}L’ ESEMPIO COMPLESSIVOUn possibile ma<strong>in</strong>, che costruisce un “mondo di animali”:public class MondoAnimale {public static void ma<strong>in</strong>(Str<strong>in</strong>g args[]) {Cavallo c = new Cavallo("Furia del West");Uomo h = new Uomo("Johnny");Corvo w = new Corvo("Il corvo dell'uva");Tonno t = new Tonno("Palmera");// AnimaleMar<strong>in</strong>o p = new AnimaleMar<strong>in</strong>o("x");// ERRATO: classe astratta!Uccello u = new Uccello("Gabbiano");P<strong>in</strong>gu<strong>in</strong>o p = new P<strong>in</strong>gu<strong>in</strong>o("Tweety");}}c.mostra(); h.mostra();w.mostra(); t.mostra();u.mostra(); p.mostra();Output del programma:Furia del West, un cavallo, nitrisce, si muoveavanzando su 4 zampe e vive sulla terraferma.Johnny, un homo sapiens, parla, si muovecamm<strong>in</strong>ando su 2 gambe e vive <strong>in</strong> un condom<strong>in</strong>io.Il corvo dell'uva, un corvo, gracchia, si muovevolando e vive <strong>in</strong> un nido su un albero....Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 12


ARRAY DI ANIMALIGrazie alla compatibilità fra tipi, è possibile pensare a strutturedati(<strong>in</strong> particolare, array) di generici animali, <strong>in</strong> cui peròpotranno trovare posto specifici animali (concreti) : un uccello, uncavallo, un tonno, etc.ESEMPIOpublic class Zoo {public static void ma<strong>in</strong>(Str<strong>in</strong>g args[]) {Animale fauna[] = new Animale[6];fauna[0] = new Cavallo("Furia del West");fauna[1] = new Uomo("Johnny");fauna[2] = new Corvo("Il corvo dell'uva");fauna[3] = new Tonno("Palmera");fauna[4] = new Uccello("Gabbiano");fauna[5] = new P<strong>in</strong>gu<strong>in</strong>o("Tweety");}}for(<strong>in</strong>t i=0; i


EREDITARIETÀ ECLASSIFICAZIONE (II)Rispetto alla rappresentazione tabellare, qualcosa è andato perso:non esistono più i concetti di “mammiferi” e “rettili”, che sisono dispersi nelle sottoclassi.Per recuperare il concetto di “mammifero”, si può solo osservareche esistono “animali acquatici mammiferi” e “animali terrestrimammiferi”, ognuno con le sue proprie caratteristiche, ma nonesiste la categoria dei “mammiferi” con le peculiarità che lacontraddist<strong>in</strong>guono.Abbiamo qu<strong>in</strong>di perso la possibilità di denotare le caratteristichecomuni a tutti (e soli) i mammiferi.In alternativa avremmo potuto adottare mammiferi e rettili comeclassificazione di primo livello:ANIMALEMAMMIFERI RETTILIMAMMIFERIACQUATICIMAMMIFERITERRESTRIRETTILIACQUATICIRETTILITERRESTRIIl questo caso, al contrario, avremmo perso la rappresentazionepura di "animale acquatico" e "animale terrestre".Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 15EREDITARIETÀ ECLASSIFICAZIONE (III)Attraverso il meccanismo di ereditarietà, è come se, nellarappresentazione tabellare precedente, fosse possibile selezionare<strong>in</strong>tere colonne, accedendo poi tramite esse alle s<strong>in</strong>gole celle, manon <strong>in</strong>tere righe.Questo è accaduto perché si è stabilita una gerarchia fra i duecriteri di classificazione, che <strong>in</strong> partenza erano ortogonali (sullostesso piano), e la ragione di ciò sta nel meccanismo diereditarietà s<strong>in</strong>gola utilizzato per implementare la tassonomia.QUINDI: l’ereditarietà s<strong>in</strong>gola è uno strumento molto potente,ma che non appare adatto a modellare tutte le situazioni.Sarebbe utile poter derivare le sottoclassi (mammiferi terrestri,rettili acquatici, etc) a partire da più classi-base, corrispondenticiascuna all’applicazione di un criterio di classificazione.In questo modo, i due criteri sarebbero sullo stesso piano erestrebbero ortogonali.Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 16


EREDITARIETÀ MULTIPLAQuando è possibile derivare una classe facendole ereditare leproprietà di più classi base si parla di ereditarietà multipla.ANIMALEMAMMIFERIRETTILIANIMALITERRESTRIANIMALIACQUATICIMAMMIFERITERRESTRIRETTILIACQUATICIRETTILITERRESTRIMAMMIFERIACQUATICIL’ereditarietà multipla è un meccanismo molto potente, ma moltodiscusso, perché <strong>in</strong>troduce ambiguità non banali da risolvere.Poiché la sottoclasse è sottotipo di tutte le sue classi base neunisce <strong>in</strong> sé i dati e i comportamenti (metodi), MA COSASUCCEDE SE:• nelle classi base vi sono campi dati o metodi omonimi? Peresempio, con riferimento alla classe mammiferi terrestri, cosasuccede se c'e' un metodo pr<strong>in</strong>t() sia <strong>in</strong> mammiferi che <strong>in</strong>animali terrestri? Quale dei due viene ereditato? Entrambi?Uno Solo? Da quale classe base?• una classe eredita, direttamente o <strong>in</strong>direttamente, più volte dauna stessa classe base? I campi dati di quest’ultima sonoreplicati o no? I metodi si considerano ambigui o no? Peresempio, mammiferi terrestri eredita <strong>in</strong>direttamente DUEVOLTE dalla classe animale. Cosa succede alla varibile nome?Per questi motivi <strong>Java</strong> non supporta l’ereditarietà multipla(disponibile, <strong>in</strong>vece - con tutti i problemi del caso - <strong>in</strong> C++).<strong>Java</strong> <strong>in</strong>troduce <strong>in</strong>vece un diverso concetto più semplice dagestire: l’ <strong>in</strong>terfaccia.Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 17INTERFACCEUna <strong>in</strong>terfaccia (<strong>in</strong>terface) è analoga a una classe, ma, adifferenza di questa, costituisce una pura specifica dicomportamenti. Come tale:• si limita a dichiarare i metodi, senza implementarli (tutti imetodi di un’<strong>in</strong>terfaccia sono implicitamente abstract)• <strong>in</strong> più, può solo def<strong>in</strong>ire costanti (cioè variabili staticf<strong>in</strong>al), ma non variabili.ESEMPIOpublic <strong>in</strong>terface AnimaleTerrestre {public deambula();}Le <strong>in</strong>terfacce possono essere estese per ereditarietà, esattamentecome le classi:public <strong>in</strong>terface Primate extends Mammifero {public void manipola();}A differenza delle classi, però, le <strong>in</strong>terfacce possono esserestrutturate anche <strong>in</strong> gerarchie di ereditarietà multipla.public <strong>in</strong>terface SuperPippoextends Mammifero, SuperEroe {...}Il motivo è che le <strong>in</strong>terfacce, non fornendo implementazioni, evitanoalla radice i problemi dell’ereditarietà multipla “classica” fraclassi, consentendo una ereditarietà multipla “controllata”.Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 18


USO DELLE INTERFACCEUna <strong>in</strong>terfaccia viene usata da (una o più) classi, che dichiaranodi implementare l’<strong>in</strong>terfaccia. Esempio:public class MammiferoTerrestreimplements AnimaleTerrestre {public void deambule() {DEFINIZIONE METODO!}}Una classe può ovviamente implementare una (o più) <strong>in</strong>terfacce econtemporanamente ereditare da una classe:public class MammiferoTerrestre extends Mammiferoimplements AnimaleTerrestre {public void deambule() {DEFINIZIONE!}}È anche possibile def<strong>in</strong>ire strutture dati (es. array) di un tipo<strong>in</strong>terfaccia, esattamente come si farebbe con una classe astratta:ovviamente, le istanze ivi memorizzate saranno di una classe(concreta) che implementi l’<strong>in</strong>terfaccia:public class Esempio {public static void ma<strong>in</strong>(Str<strong>in</strong>g args[]) {AnimaleTerrestre a[] = new AnimaleTerrestre[20];a[1] = new MammiferoTerrestre();}}In varie situazioni, <strong>Java</strong> def<strong>in</strong>isce delle <strong>in</strong>terfacce vuote: tali sono,ad esempio, Serializable e Cloneable. Il loro scopo è fare da“marcatori”, obbligando le classi che vogliono sfruttare certefunzionalità a <strong>in</strong>dicarlo <strong>in</strong> modo esplicito, dichiarando diimplementare tali <strong>in</strong>terfacce.Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 19INTERFACCE E METODOLOGIALe <strong>in</strong>terfacce <strong>in</strong>troducono un diverso modo di concepire ilprogetto.Prima si def<strong>in</strong>iscono le <strong>in</strong>terfacce che occorrono e si stabilisce<strong>in</strong> che relazione devono essere fra loroPoi si def<strong>in</strong>iscono le classi che le implementanoVantaggi:• la gerarchia delle <strong>in</strong>terfacce, che riflette il progetto, è separatada quella delle classi, che riflette scelte implementative• è possibile scegliere a ogni livello di progetto ciò che è piùappropriatoAd esempio, l’<strong>in</strong>terfaccia B può estendere l’<strong>in</strong>terfaccia A, maquesto non implica che la classe Y, che implementa B, debbaestendere la classe X che implementa A…Anzi, le due classi potrebbero essere <strong>in</strong> relazione opposta, o anchenon avere alcuna relazione fra loro!Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 20


ESEMPIO: IL REGNO ANIMALEDue classificazioni ortogonali, una di classi e una di <strong>in</strong>terfacce.Gerarchia di classi:ANIMALEMAMMIFERI RETTILIGerarchia di <strong>Interfacce</strong>:ANIMALEDIQUALCHELUOGOANIMALE TERRESTRE ANIMALE ACQUATICOSistema F<strong>in</strong>ale:ANIMALEDIQUALCHELUOGOANIMALETERRESTREANIMALEACQUATICOANIMALEExtendsMAMMIFERI RETTILIMAMMIFERIACQUATICIMAMMIFERITERRESTRIRETTILIACQUATICIRETTILITERRESTRISi poteva pensare di <strong>in</strong>vertire i ruoli delle gerarchie di <strong>in</strong>terfacce edi classe, ma è certamente più naturale pensare a mammiferi erettili come classi (con metodi e proprietà che specificano lecaratteristiche peculiari di mammiferi e rettili), e qu<strong>in</strong>di pensare alposto dove vivono gli animali <strong>in</strong> term<strong>in</strong>i di <strong>in</strong>terfacce (con metodiche specificano come gli animali si muovono…)Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 21ESEMPIO: NUMERI COMPLESSIIn un l<strong>in</strong>guaggio a oggetti che offra solo classi (C++):• se si dispone già di una classe che rappresenta i numeri reali,viene spontaneo def<strong>in</strong>ire la classe dei complessi comesottoclasse dei reali, <strong>in</strong> quanto, operativamente, si tratta diaggiungere un campo-dati (la parte immag<strong>in</strong>aria)• ma un tale modo di procedere darebbe però risultati assurdi,perché porterebbe a un modello del mondo <strong>in</strong> cui i complessisono un sottotipo dei reali, il che è contraddetto dalla realtà.• occorre dunque <strong>in</strong>vertire il rapporto fra le classi, def<strong>in</strong>endo ireali come sottoclasse dei complessi• tuttavia, questo comporta <strong>in</strong>efficienza, <strong>in</strong> quanto ogni reale haanche una parte immag<strong>in</strong>aria (che dovrà valere sempre 0).In un l<strong>in</strong>guaggio a oggetti con <strong>in</strong>terfacce, <strong>in</strong>vece:• il rapporto fra le <strong>in</strong>terfacce può essere quello suggerito dellarealtà da modellare (qui: reali che derivano da complessi)• ma il rapporto fra le classi che le implementano può esserediverso, <strong>in</strong> particolare, ispirato a criteri di efficienza (qui: laclasse dei complessi può avere due campi dati, quella dei realiuno solo)Franco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 22


NOTA FINALE: METODOLOGIE DIANALISI E PROGETTOLa programmazione ad oggetti ha un forte impatto sul processodi produzione del software perchèINVITA FORTEMENTE AD ANALIZZARE E PROGETTAREUN SISTEMA SOFTWARE PRIMA DI REALIZZARLOFase di Analisi:• identificare che cosa il sistema deve fare e <strong>in</strong> che ambienteapplicativo si colloca• identificare che oggetti il sistema deve modellare, <strong>in</strong>tendendosia oggetti come astrazioni di ogget reali, sia oggetti concepiticome pure entità software• identificare le proprietà e i servizi che devono essere servitidagli oggettiFase di Progetto:• def<strong>in</strong>ire le classi del sistema• analizzare le caratteristiche degli oggetti identificati nella fasedi analisi, estrarre le proprietà comuni• def<strong>in</strong>ire le gerarchie di ereditarietà, possibilmente usando classiastratte, e sfruttando le <strong>in</strong>terfacce per estrarre proprietà comuniche escono dalla classificazione della gerarchia di ereditarietà• eventualmente ri-usare classi e grarchie precedentementedef<strong>in</strong>ite o disponibili <strong>in</strong> librerieFase di Realizzazione:• scrivere le classi del sistema e i metodiFranco Zambonelli, Enrico Denti - CLASSI ASTRATTE, INTERFACCE IN JAVA 23

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!