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