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