La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.

Presentazioni simili


Presentazione sul tema: "Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies."— Transcript della presentazione:

1 Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo1 Capitolo 25 marzo 2004

2 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo2 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

3 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo3 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() + "."; }

4 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo4 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à + "."; }

5 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo5 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.

6 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo6 Le classi Persona e Studente nome : String «costruttore» Persona(String nome) «operazioni» String getNome() String toString() Persona estende università : String «costruttore» Studente(String nome, String università) «operazioni» String getUniversità() String toString() Studente nome = "Mario" String getNome() String toString() mario : Persona nome = "Paola" università = "Roma Tre" String getNome() String getUniversità() String toString() paola : Studente

7 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo7 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)

8 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo8 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)!

9 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo9 L’operatore instanceof Persona mario; Studente paola; mario = new Persona("Mario"); paola = new Studente("Paola", "Roma Tre"); System.out.println(mario instanceof Persona); // true System.out.println(mario instanceof Studente); // false System.out.println(paola instanceof Persona); // true System.out.println(paola instanceof Studente); // true

10 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo10 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.

11 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo11 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)

12 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo12 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; }

13 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo13 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

14 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo14 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

15 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo15 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

16 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo16 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(); }

17 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo17 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; }

18 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo18 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; }

19 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo19 Uso di forme geometriche Quadrato q; // un quadrato Forma fq; // un altro quadrato q = new Quadrato(5, "bianco"); // lato 5 e colore bianco fq = new Quadrato(10, "rosso"); // lato 10 e colore rosso System.out.println(q.area()); // 25.0 System.out.println(q.colore()); // bianco System.out.println(q.lato()); // 5.0 System.out.println(fq.area()); // System.out.println(fq.colore()); // rosso System.out.println(fq.lato()); // NO, errore // di compilazione!

20 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo20 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

21 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo21 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); } le classi String e Integer implementano questa interfaccia

22 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo22 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...

23 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo23 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.valoreo.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); }

24 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo24 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

25 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ereditarietà e polimorfismo25 Interfacce e implementazione di interfacce int compareTo(Object o) «interfaccia» Comparable implementa valore : int «costruttore» Numero(int v) «operazioni» int getValore() void setValore(int v) int compareTo(Numero o) int compareTo(Object o) Numero


Scaricare ppt "Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies."

Presentazioni simili


Annunci Google