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