Fondamenti di informatica
Oggetti e Java
Luca Cabibbo
Ereditarietà e polimorfismo
Capitolo 25
marzo 2004
1
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Estensione di classi
Estensione (o derivazione) di classi
 definizione di una classe a partire da un’altra classe mediante
l’aggiunta e/o la specializzazione di funzionalità
 classe base o super-classe
 classe estesa o derivata o sotto-classe
2
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La classe Persona
/* Un oggetto Persona rappresenta una persona. */
class Persona {
/* Il nome di questa Persona. */
private String nome;
/* Crea una nuova Persona, dato il nome. */
public Persona(String nome) {
this.nome = nome;
}
/* Restituisce il nome di questa Persona. */
public String getNome() {
return nome;
}
/* Restituisce una descrizione di questa Persona. */
public String toString() {
return "Mi chiamo " + getNome() + ".";
}
}
3
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La classe Studente
/* Un oggetto Studente rappresenta uno studente. */
class Studente extends Persona {
/* L'università in cui studia questo Studente. */
private String università;
/* Crea un nuovo Studente, dati nome e università. */
public Studente(String nome, String università) {
super(nome);
this.università = università;
}
/* Restituisce l'università di questo Studente. */
public String getUniversità() {
return università;
}
/* Restituisce una descrizione di questo Studente. */
public String toString() {
return "Mi chiamo " + getNome() +
" e studio a " + università + ".";
}
4
}
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Uso delle classi Persona e Studente
Persona mario;
Studente paola;
mario = new Persona("Mario");
System.out.println(mario.getNome());
// Mario
System.out.println(mario.toString());
// Mi chiamo Mario.
paola = new Studente("Paola", "Roma Tre");
System.out.println(paola.getNome());
// Paola
System.out.println(paola.getUniversità());
// Roma Tre
System.out.println(paola.toString());
// Mi chiamo Paola e studio a Roma Tre.
5
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Le classi Persona e Studente
Persona
nome : String
«costruttore»
Persona(String nome)
«operazioni»
String getNome()
String toString()
mario : Persona
nome = "Mario"
String getNome()
String toString()
estende
paola : Studente
Studente
università : String
«costruttore»
Studente(String nome, String università)
«operazioni»
String getUniversità()
String toString()
6
Ereditarietà e polimorfismo
nome = "Paola"
università = "Roma Tre"
String getNome()
String getUniversità()
String toString()
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Polimorfismo
Polimorfismo
 un oggetto di una classe viene visto come dotato di diverse
“forme”
Polimorfismo, in pratica
 è possibile assegnare il riferimento a un oggetto della classe
estesa a una variabile il cui tipo è la classe base
 tipo statico e tipo dinamico (late binding)
7
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Polimorfismo
Persona riccardo;
riccardo = new Studente("Riccardo", "La Sapienza");
System.out.println(riccardo.toString());
// Mi chiamo Riccardo e studio a La Sapienza.
// e non: Mi chiamo Riccardo.
System.out.println(riccardo.getUniversità());
// NO, ERRORE (IN COMPILAZIONE)!
8
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
L’operatore instanceof
Persona mario;
Studente paola;
mario = new Persona("Mario");
paola = new Studente("Paola", "Roma Tre");
System.out.println(mario
System.out.println(mario
System.out.println(paola
System.out.println(paola
9
Ereditarietà e polimorfismo
instanceof
instanceof
instanceof
instanceof
Persona);
Studente);
Persona);
Studente);
//
//
//
//
true
false
true
true
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Conversione esplicita
Persona riccardo;
Studente riccardoComeStudente;
riccardo = new Studente("Studente", "La Sapienza");
riccardoComeStudente = (Studente) riccardo;
System.out.println(
riccardoComeStudente .getUniversità());
// Mi chiamo Riccardo e studio a La Sapienza.
10
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La classe Object
In Java tutte le classi estendono (direttamente o indirettamente) la
classe Object definita nel package java.lang
 la classe Object definisce un comportamento comune per tutti
gli oggetti istanza
 String toString()
 boolean equals(Object altro)
11
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Il metodo equals
Nella classe Punto è opportuno definire i seguenti metodi
/* Verifica se questo punto è uguale al Punto p. */
public boolean equals(Punto p) {
// pre: p!=null
return (this.x==p.x) && (this.y==p.y);
}
/* Verifica se questo oggetto è uguale all’oggetto p. */
public boolean equals(Object p) {
// pre: p!=null
boolean uguali;
if (p instanceof Punto)
uguali = this.equals((Punto) p);
else
uguali = false;
return uguali;
}
12
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Estensione di classi e progettazione di classi
L’estensione di classi (e l’ereditarietà in generale) è una tecnica
che va tenuta in considerazione nella progettazione di un insieme
di classi
 prima viene progettata la gerarchia delle classi che si vogliono
definire
 poi vengono implementate le varie classi
 criteri per decidere se una classe può essere definita come
estensione di una classe
13
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Il modificatore protected
Nella definizione di gerarchie di classi, l’uso dei soli modificatori
public e private è troppo restrittivo
 viene di solito usato il modificatore protected
 un livello di restrizione dell’accesso intermedio tra public e
private
14
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Classi astratte
Una classe astratta è una classe implementata in modo parziale
 metodi astratti – viene specificata la loro intestazione ma
non il loro corpo
 una classe astratta non può essere istanziata
Utilità delle classi astratte
 definire il comportamento comune per tutte le classi della
gerarchia
 dichiarare le funzionalità che devono essere implementate da
tutte le classi che la estendono
15
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La classe astratta Forma
/* Un oggetto Forma rappresenta una forma geometrica. */
abstract class Forma {
/* Il colore di questa Forma. */
protected String colore;
/* Crea una nuova Forma di un certo colore. */
public Forma(String colore) {
this.colore = colore;
}
/* Restituisce il colore di questa Forma. */
public String colore() {
return colore;
}
/* Restituisce l'area di questa Forma. */
/* (Ogni forma deve saper calcolare la propria area.) */
public abstract double area();
}
16
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La classe concreta Quadrato
/* Un Quadrato rappresenta una forma geometrica quadrato. */
class Quadrato extends Forma {
/* Il lato di questo Quadrato. */
protected double lato;
/* Crea una nuovo Quadrato. */
public Quadrato(double lato, String colore) {
super(colore);
this.lato = lato;
}
/* Restituisce il lato di questo Quadrato. */
public double lato() {
return lato;
}
/* Restituisce l'area di questo Quadrato. */
public double area() {
return lato*lato;
}
}
17
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La classe concreta Cerchio
/* Un Cerchio rappresenta una forma geometrica cerchio. */
class Cerchio extends Forma {
/* Il raggio di questo Cerchio. */
protected double raggio;
/* Crea una nuovo Cerchio. */
public Cerchio(double raggio, String colore) {
super(colore);
this.raggio = raggio;
}
/* Restituisce il raggio di questo Cerchio. */
public double raggio() {
return raggio;
}
/* Restituisce l'area di questo Cerchio. */
public double area() {
return raggio*raggio*Math.PI;
}
}
18
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Uso di forme geometriche
Quadrato q;
Forma fq;
// un quadrato
// un altro quadrato
q = new Quadrato(5, "bianco");
// lato 5 e colore bianco
fq = new Quadrato(10, "rosso");
// lato 10 e colore rosso
19
System.out.println(q.area());
System.out.println(q.colore());
System.out.println(q.lato());
// 25.0
// bianco
// 5.0
System.out.println(fq.area());
System.out.println(fq.colore());
// 100.0
// rosso
System.out.println(fq.lato());
// NO, errore
// di compilazione!
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Interfacce
Una interfaccia (interface) consiste nella dichiarazione di un
certo numero di metodi d’istanza e pubblici – implicitamente
astratti
 una classe implementa una interfaccia se implementa tutti i
metodi d’istanza dichiarati dall’interfaccia
20
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio – l’interfaccia Comparable
public interface Comparable {
/** Confronta questo oggetto con o per determinare
* in che relazione d'ordine sono.
* Restituisce:
*
- zero, se questo oggetto e o sono uguali
*
- un valore negativo,
*
se questo oggetto è minore di o
*
- un valore positivo,
*
se questo oggetto è maggiore di o. */
public int compareTo(Object o);
}

21
le classi String e Integer implementano questa interfaccia
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Implementazione di interfacce
/* Un oggetto Numero rappresenta un numero intero,
* con un valore che può essere acceduto e modificato. */
class Numero implements Comparable {
/* valore del numero */
private int valore;
/* Crea un nuovo Numero che ha valore iniziale v. */
public Numero(int v) {
this.valore = v;
}
/* Calcola il valore di questo numero. */
public int getValore() {
return this.valore;
}
/* Cambia in v il valore di questo numero. */
public void setValore(int v) {
this.valore = v;
}
... segue ...
22
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Implementazione di interfacce
/* Verifica in che ordine sono questo numero
* e il numero o. */
public int compareTo(Numero o) {
// pre: o!=null
int confronto;
if (this.valore==o.valore)
confronto = 0;
else if (this.valore<o.valore)
confronto = -1;
else
// this.valore>o.valore
confronto = 1;
return confronto;
}
/* Verifica in che ordine sono questo numero
* e l’oggetto o. */
public int compareTo(Object o) {
// pre: o!=null && o instanceof Numero
return compareTo((Numero) o);
}
}
23
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Interfacce e polimorfismo
Una interfaccia definisce un tipo (parziale) che può essere
implementato polimorficamente da più classi
 il metodo void sort(Object[] a) di Arrays ipotizza che gli
elementi di a
 siano tutti di uno stesso tipo
 che questo tipo implementi l’interfaccia Comparable
 posso usarlo per ordinare un array di Numero
24
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Interfacce e implementazione di interfacce
«interfaccia»
Comparable
int compareTo(Object o)
implementa
Numero
valore : int
«costruttore»
Numero(int v)
«operazioni»
int getValore()
void setValore(int v)
int compareTo(Numero o)
int compareTo(Object o)
25
Ereditarietà e polimorfismo
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl