Principi di Progettazione del Software a.a. 2016-2017 Fondamenti di Java Ing. Roberto Vergallo Principi di Progettazione del Software ■ https://twitter.com/RVergallo Fondamenti di java 2 Roberto Vergallo 1 Obiettivi della lezione ■ Introduzione alla programmazione Object Oriented – Ereditarietà – Polimorfismo – Interfacce – Eccezioni Roberto Vergallo 3 Fondamenti di java Ereditarietà ■ L’idea di base è quella di classificare gli oggetti mettendo a fattor comune le analogie Animale Vertebrato Pesce Invertebrato Anfibio Rettile Uccello Mammifero Carnivoro Erbivoro ■ Attenzione: la gerarchia dipende dallo scopo Fondamenti di java 4 Roberto Vergallo 2 Ereditarietà (cont.) ■ Vantaggi dell’ereditarietà: – Semplificazione delle operazioni di manutenzione di un’applicazione – Riutilizzabilità del codice Libro Libri Utente Libro di letteratura Libri di latino Testi scientifici Libri di pittura Libri di scultura Libro di matematica Diagramma di un’applicazione procedurale Diagramma di ereditarietà Fondamenti di java Thriller 5 Roberto Vergallo Ereditarietà (cont.) ■ Stabilita la classe base, possiamo creare tanti libri purchè aderiscano alle regole definite. ■ Una volta stabilite le categorie di base, possiamo utilizzarle per creare tipi specifici di oggetti ereditando e specializzando le regole di base. ■ Un linguaggio orientato ad oggetti fornisce al programmatore strumenti per rappresentare queste relazioni. Un’applicazione sarà in grado di utilizzare ogni oggetto specifico senza essere necessariamente riscritto, ma limitando le modifiche alle funzionalità fornite dall’oggetto per manipolare le sue proprietà Fondamenti di java 6 Roberto Vergallo 3 Ereditarietà in Java ■ Le sottoclassi ereditano la struttura (intesa come schema) ed il comportamento dalle superclassi Alfa method1 class Alfa { String var1; } void method1() { ... } var1 Beta method1 class Beta extends Alfa { String var2; } var1 var2 void method2() { ... } method2 Gamma method1 class Gamma extends Beta { String var3; } var1 var2 var3 method2 method3 void method3() { ... } Roberto Vergallo 7 Fondamenti di java Struttura di classi ■ Un programma Java è rappresentato da una gerarchia di classi ■ La classe Object è la radice di tale gerarchia class A1 { ... } Specializzazione A1 A2 B1 B2 B3 class A2 extends A1{ ... } Fondamenti di java C1 B4 8 Generalità Object B5 Roberto Vergallo 4 Oscuramento dei metodi ■ (Detto anche overriding dei metodi) ■ In una sottoclasse si può oscurare un metodo definito in una superclasse con una nuova definizione. class Bicicletta { ... void cambiaRapporto(int r) { ... } } Ciclista bici.cambiaRapporto(2) bici Bicicletta class MountainBike extends Bicicletta { ... void cambiaRapporto(int r) { ... } } ■ La compatibilità con la segnatura definita nella superclasse viene preservata (polimorfismo) Roberto Vergallo 9 Fondamenti di java Specializzazione dei metodi ■ (Detta anche overloading dei metodi) ■ La ‘risposta’ di un oggetto ad un messaggio può dipendere dal tipo dei parametri class Zoofilo extends Persona { ... void accarezza(Gattino g) { } Spiritoso affettuosame nte amico.accarezza(animaleSconosciuto ) amico void accarezza(Tigre t) { Zoofilo col pensiero } void accarezza(Object o) { } informati prima } ■ La selezione è automatica in base alla segnatura Fondamenti di java 10 Roberto Vergallo 5 Pseudo-variabili ■ Nei metodi di istanza, è possibile utilizzare le pseudo-variabili this e super ■ this fa riferimento all’istanza stessa – si usa per evitare ambiguità class Ciclista extends Persona { Bicicletta bici; boolean dimmiSeTua(Bicicletta bici) { return this.bici = bici; } ■ } super fa riferimento all’istanza stessa come se appartenesse alla superclasse – si usa per evitare ambiguità e per specializzare metodi class ContoAziendale extends ContoCorrente { RegistroCassa registro; class ContoCorrente { float saldo; } void deposita(float somma) { saldo += somma; } } void deposita(float somma) { super.deposita(somma); registro.annotaEntrata(somma); } Roberto Vergallo 11 Fondamenti di java Interfacce ■ L’idea di base è quella di un contratto tra oggetti, una sorta di visibilità limitata Fisco contribuente.dichiaraImponibile(1998) Persona interfaccia Contribuente interface Contribuente { float dichiaraImponibile(int anno); } Fondamenti di java class Ingegnere extends Persona implements Contribuente { ... float dichiaraImponibile(int anno) { ... } } 12 Roberto Vergallo 6 Uso delle interfacce ■ Le interfacce contengono solo: – la dichiarazione di metodi (come signature); – la definizione di costanti ■ Le interfacce sono un tipo valido per le variabili ■ Le interfacce possono essere organizzate in strutture ad eredità multipla ■ Una classe può implementare un numero qualsiasi di interfacce class Ingegnere extends Persona implements Contribuente, MembroOrdineIngegneri, PersonaTipicamenteNoiosa, ... { ... } Roberto Vergallo 13 Fondamenti di java Gestione delle eccezioni ■ La gestione delle eccezioni in Java è un sistema per governare il flusso dell’esecuzione a seguito di errori – di fatto, sostituisce l’unico uso sensato della goto – (che in Java non esiste) class Zoofilo extends Persona { ... void accarezza(Object obj) { class Spiritoso extends Persona { ... void proponi(Zoofilo amico) { try { amico.accarezza(...); } catch (MaTuSeiMattoException e) { // Evidentemente, non gradisce } ... } if (obj instanceof ScorpioneVelenoso) { throw new MaTuSeiMattoException(); } ... } } } Fondamenti di java 14 Roberto Vergallo 7 Eccezioni ■ Le eccezioni sono organizzate come una gerarchia di classi; ■ L’abbinamento throw / catch si stabilisce in base al tipo; ■ Esistono eccezioni checked (i.e. che vengono controllate dal compilatore) ed eccezioni uncheked. class Zoofilo extends Persona { ... void accarezza(Object obj) throws MaTuSeiMattoException { Throwable Exception if (obj instanceof ScorpioneVelenoso) { RuntimeException throw new MaTuSeiMattoException(); } ... } MaTuSeiMattoException Fondamenti di java } 15 Roberto Vergallo 8