Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di...

45
http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà A. Miola Maggio 2012

Transcript of Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di...

Page 1: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 1

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Dispensa 25 Ereditarietà

A. Miola Maggio 2012

Page 2: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 2

Contenuti

q Livelli di astrazione ed ereditarietà

q Estensione di classi

q Polimorfismo

q La classe Object

q Classi astratte

q Interfacce

Page 3: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 3

Alcune riflessioni q Riprendiamo alcune riflessioni fatte in

precedenza §  Cosa è il tipo Object ? §  Che relazione c’è tra il tipo astratto Q dei numeri

razionali e il tipo astratto Coppia ? •  Il tipo Q è un caso particolare di Coppia

§  Che relazione c’è tra la classe Razionale e la classe Coppia ?

•  In che senso la classe Razionale può essere intesa come un caso particolare della classe Coppia ?

•  Cosa vuol dire in Java che una classe è un caso particolare di un’altra classe ?

§  Per rispondere a queste domande dobbiamo introdurre il concetto di ereditarietà e i relativi meccanismi di realizzazione

Page 4: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 4

Ereditarietà

q Una delle caratteristiche distintive del paradigma di programmazione orientato agli oggetti è l’ereditarietà §  l’ereditarietà permette di definire nuove classi

mediante l’aggiunta e/o la specializzazione di funzionalità ad altre classi, già esistenti oppure appositamente progettate e definite

q Il linguaggio Java fornisce tre meccanismi (costrutti linguistici) di ereditarietà §  estensione di classi §  classi astratte §  interfacce

Page 5: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 5

Estensione di classi . . . q L’estensione (o derivazione) di classi è il

meccanismo che permette di definire una classe (per istanziare oggetti) a partire da un’altra classe mediante l’aggiunta e/o la specializzazione di funzionalità §  la classe “di partenza” è chiamata classe base

oppure super-classe §  la nuova classe che viene definita è chiamata classe

estesa o derivata oppure sotto-classe

Page 6: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 6

. . . Estensione di classi q Tutte le proprietà e le operazioni definite dalla

classe base sono implicitamente definite anche nella classe estesa che le eredita §  la classe estesa può definire delle nuove proprietà e

nuove funzionalità per i propri oggetti §  la classe estesa può ri-definire le funzionalità già definite

nella classe base

q Ogni oggetto istanza della classe estesa può essere considerata anche un oggetto istanza della classe base

Page 7: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 7

Esempio — la classe Persona. . . q Si consideri la seguente classe Persona q Un oggetto Persona rappresenta una persona q L’unica proprietà di una Persona è il suo nome

§  nome è una variabile d’istanza (privata) q È possibile costruire un nuovo oggetto Persona

che ha un certo nome §  la classe Persona ha un costruttore

parametrico rispetto al nome

Page 8: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 8

. . . Esempio — la classe Persona q A una Persona è possibile chiedere il suo nome

§  il metodo (d’istanza) pubblico String getNome() restituisce il nome della Persona

q A una Persona è possibile chiedere una sua descrizione §  il metodo (d’istanza) pubblico String

toString() restituisce un descrizione della Persona

q Si può verificare l’uguaglianza tra oggetti Persona con il metodo (d’istanza) pubblico equals

Page 9: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 9

La classe Persona . . .

/** Un oggetto Persona rappresenta una persona. */

class Persona { /** Il nome. */ private String nome; /** Crea una Persona, dato il nome. */ public Persona(String nome) { this.nome = nome; }

. . . Segue . . .

Page 10: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 10

. . . La classe Persona . . . Segue . . .

/** Restituisce il nome della Persona. */ public String getNome() { return nome; } /** Restituisce una descrizione. */ public String toString() { return "Mi chiamo " + getNome() + ".";} /** Verifica l’uguaglianza. */ public boolean equals(Persona p) { return this.nome.equals(p.nome); } }

Page 11: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 11

Esempio — la classe Studente . . .

q Si supponga ora di voler definire la seguente classe Studente

q Un oggetto Studente rappresenta uno studente universitario §  le proprietà di uno Studente sono il suo nome e il

nome dell’università in cui studia

q È possibile costruire un nuovo Studente che ha un certo nome e studia in una certa università §  la classe Studente ha un costruttore parametrico

rispetto al nome e all’università

Page 12: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 12

. . . Esempio — la classe Studente q A uno Studente è possibile chiedere il suo

nome e l’università in cui studia nonché una sua descrizione con i metodi §  String getNome() che restituisce il nome dello

Studente §  String getUniversità() che restituisce l’università

dello Studente §  String toString() che restituisce un descrizione dello

Studente q A uno Studente è possibile chiedere di verificare

l’uguaglianza con un altro Studente con il metodo (d’istanza) pubblico equals

Page 13: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 13

Dalla classe Persona alla classe Studente

q Si osservi come la classe Studente estenda e specializzi il comportamento della classe Persona

q La classe Studente serve a modellare degli oggetti che sono “casi particolari” della classe Persona §  un oggetto Studente sa eseguire tutte le operazioni

degli oggetti Persona §  un oggetto Studente sa eseguire anche delle ulteriori

operazioni, che gli oggetti Persona non sanno eseguire

Page 14: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 14

Dalla classe Persona alla classe Studente

q In Java è possibile definire la classe Studente a partire dalla definizione della classe Persona §  aggiungendo nuove proprietà e nuove funzionalità §  ri-definendo funzionalità già definite nella classe base

q La classe Studente è una sotto-classe della classe Persona

q La classe Persona è una super-classe della classe Studente

q Nella classe Studente continuano ad essere valide tutte le funzionalità della classe Persona che non vengono ridefinite

Page 15: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 15

La classe Studente . . . /** Un oggetto Studente rappresenta uno studente. */ class Studente extends Persona { /** L'università. */ private String università; /** La proprietà nome viene ereditata dalla classe

Persona e quindi non va definita la variabile d’istanza nome. */ /** Crea uno Studente, dati nome e università. */ public Studente(String nome, String università) { super(nome); // invoca il costruttore di Persona this.università = università; }

Page 16: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 16

. . . La classe Studente . . . /** Restituisce l'università dello Studente. */ public String getUniversità() { return università; } /** Il metodo getNome viene ereditato dalla classe

Persona e quindi non va definito. */ /** Inserire le definizioni dei metodi d’istanza toString e equals. */

}

Page 17: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 17

. . . La classe Studente . . .

q La classe estesa può ridefinire i metodi della classe base se ne vuole modificare la definizione (overriding o sovrascrittura)

q Questo è il caso dei metodi toString e equals che possono essere definiti come segue

Page 18: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 18

. . . La classe Studente /** Restituisce una descrizione dello Studente. */ public String toString() { return "Mi chiamo " + getNome() + ". " + "Studio a " + getUniversità() + "."; /** Verifica l’uguaglianza tra oggetti Studente. */ public boolean equals(Studente s) { return this.getNome.equals(s.getNome) && this.getUniversita.equals(s.getUniversita);

}

Page 19: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 19

Uso delle classi Persona e Studente . . . q Gli oggetti della classe derivata sono

compatibili con gli oggetti della classe base – ma non viceversa

q Un oggetto Studente è anche una istanza della classe Persona

q Un oggetto Persona non è una istanza della classe Studente §  Non tutte le persone sono studenti §  La classe estesa modella un insieme di oggetti che

è un sottoinsieme degli oggetti modellati dalla classe base

Page 20: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 20

. . . Uso delle classi Persona e Studente . . . q Il seguente frammento di codice mostra un

esempio di uso degli oggetti Persona e Studente Persona mario = new Persona("Mario"); Studente paola = new Studente("Paola", "Roma Tre"); Persona p; Studente s; p = paola // OK! Studente e’ compatibile con Persona s = mario // NO! Persona non e’ compatibile con Studente

. . . Segue . . .

Page 21: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 21

. . . Uso delle classi Persona e Studente System.out.println(mario.getNome()); // Mario System.out.println(mario.toString());// Mi chiamo Mario. /* OK! getNome e toString sono metodi di Persona */ System.out.println(paola.getNome()); // Paola System.out.println(paola.getUniversità()); // Roma Tre /* OK! getNome e getUniversità sono metodi di Studente */ System.out.println(mario.getUniversità()); /* NO! getUniversità e’ un metodo di Studente */ System.out.println(paola.toString()); // Mi chiamo Paola. Studio a Roma Tre.

/* OK! toString e’ un metodo di Studente * sovrascritto a quello omonimo di Persona */

Page 22: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 22

Polimorfismo . . .

q L’aspetto fondamentale dell’estensione di classe (e dell’ereditarietà in generale) è il polimorfismo §  per polimorfismo si intende la possibilità di

assegnare il riferimento a un oggetto della classe estesa a una variabile il cui tipo è la classe base – ad esempio …

Persona mario = new Persona("Mario"); Studente paola = new Studente("Paola", "Roma Tre"); Persona p; Studente s; p = paola // OK! Studente e’ compatibile con Persona s = mario // NO! Persona non e’ compatibile con

Studente

Page 23: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 23

. . . Polimorfismo . . .

q Il polimorfismo consente di assegnare il riferimento a un oggetto della classe estesa a una variabile il cui tipo è la classe base §  a tale oggetto è possibile richiedere solo il

comportamento dichiarato dalla classe base §  tuttavia, il comportamento dell’oggetto viene scelto

sulla base del tipo effettivo dell’oggetto, e non sul tipo della variabile (late binding)

§  ciò implica che se sull’oggetto viene invocato un metodo che è sovrascritto nella classe derivata allora viene usato il metodo sovrascritto

Page 24: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 24

. . . Polimorfismo

q Ad esempio con rifetimento alle classi Persona e Studente

Persona paola; paola = new Studente("Paola", "Roma Tre");

System.out.println(paola.toString()); // Mi chiamo Paola. Studio a Roma Tre. // e non: Mi chiamo Paola. // toString e’ definito anche in Persona System.out.println(paola.getUniversità()); // NO, ERRORE (IN COMPILAZIONE)! // getUniversità non e’ definito in Persona

Page 25: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 25

Polimorfismo e parametri . . .

q In modo simile, nell’invocazione di un metodo che ha un parametro del tipo della classe base, è possibile usare come parametro attuale il riferimento a un oggetto istanza della classe estesa §  a tale oggetto è possibile richiedere solo il

comportamento dichiarato dalla classe base §  tuttavia, il comportamento dell’oggetto viene scelto

sulla base del tipo effettivo dell’oggetto (parametro attuale), e non sul tipo della variabile (parametro formale)

Page 26: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 26

. . . Polimorfismo e parametri

q Ad esempio §  definizione del metodo public static void stampa(Persona p) { System.out.println(p.toString()); }

§  invocazione del metodo stampa( new Studente("Marco", "Roma Tre") ); // Mi chiamo Marco. Studio a Roma Tre.

§  il parametro formale del metodo stampa è di tipo Persona che viene legato al parametro attuale che è di tipo Studente

Page 27: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 27

Conversione esplicita . . .

q Si consideri nuovamente il caso di una variabile del tipo della classe base che memorizza il riferimento a un oggetto §  se si è sicuri che la variabile memorizza il riferimento

a un oggetto istanza della classe estesa, allora è possibile effettuare una conversione esplicita (cast) del riferimento, per ottenere un riferimento del tipo della classe estesa

•  la conversione permette di utilizzare il comportamento specifico della classe estesa

•  la conversione esplicita genera una eccezione se l’oggetto referenziato non ha il tipo della classe a cui si converte

Page 28: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 28

. . . Conversione esplicita

q Ad esempio

Persona johnP; // john come Persona Studente johnS; // john come Studente johnP = new Studente("John", "Stanford"); johnS = (Studente) johnP; // ok System.out.println(johnS.getUniversità());// ok System.out.println(johnP.getUniversità());// NO

Page 29: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 29

La classe Object . . .

q In Java, tutte le classi estendono (direttamente o indirettamente) la classe Object definita nella API di Java (in java.lang) §  la classe Object è la super-classe per tutte le altre

classi (già definite in Java o definite dall’utente) §  la classe Object definisce un comportamento

comune per tutti gli oggetti istanza §  tutte le classi ereditano questo comportamento

comune — ma possono ridefinirlo se necessario

Page 30: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 30

. . . La classe Object

q Ad esempio, la classe Object definisce il metodo boolean equals(Object altro) per verificare se due oggetti sono uguali §  nell’implementazione di Object, due oggetti sono

uguali se sono identici (ovvero, se sono lo stesso oggetto)

§  ogni classe in cui è significativa una nozione di uguaglianza (diversa dall’identità) deve ridefinire questo metodo

•  si pensi ad esempio alla classe String

Page 31: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 31

Estensione di classi e progettazione di classi

q L’estensione di classi è una tecnica da utilizzare quindi nella progettazione di un insieme di classi che condividono alcune funzionalità §  solitamente, si procede prima progettando la

gerarchia delle classi che si vogliono definire, ciascuna con le proprie funzionalità, e poi implementando le varie classi, dalle super-classi verso le sotto-classi

§  per decidere se una classe può essere definita come l’estensione di un’altra classe, viene seguito il seguente criterio

•  la classe estesa deve modellare un insieme di oggetti che è un sottoinsieme degli oggetti modellati dalla classe base

•  si pensi ad esempio alle classi Persona e Studente

Page 32: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 32

Il modificatore protected . . . q Nella definizione di gerarchie di classi, l’uso dei

soli modificatori public e private è troppo restrittivo §  spesso è utile permettere a una classe estesa di

accedere alle componenti “private” della classe base, senza che queste componenti siano rese accessibili a tutti gli altri oggetti

§  questa modalità di accesso non può essere definita utilizzando i modificatori public e private

q In questi casi può essere utilizzato il modificatore protected

Page 33: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 33

. . . Il modificatore protected q In questi casi può essere utilizzato il

modificatore protected §  un componente (variabile o metodo) dichiarato

protected in una classe C può essere acceduto dalle classi che estendono C

§  il modificatore protected offre un livello di restrizione dell’accesso intermedio tra public e private

§  nella definizione di classi da estendere, viene spesso utilizzato il modificatore protected anziché il modificatore private

Page 34: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 34

Classi astratte . . .

q Una classe astratta è una classe implementata in modo parziale §  una classe astratta è una classe che contiene la

dichiarazione di alcuni metodi (metodi astratti), di cui viene specificata solo l’intestazione ma non il corpo

§  una classe astratta non può essere istanziata, appunto perché definita in modo incompleto

§  le classi astratte sono progettate per essere estese da classi che forniscono delle opportune implementazioni per i metodi astratti

Page 35: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 35

. . . Classi astratte

q Le classi astratte sono utili nella definizione di una gerarchia di classi, in cui la super-classe (astratta) viene definita con i seguenti scopi §  definire il comportamento comune per tutte le classi

della gerarchia §  dichiarare (senza implementare) le funzionalità che

devono essere implementate da tutte le classi che la estendono

Page 36: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 36

Esempio

q Si vogliono definire delle classi i cui oggetti rappresentano delle forme geometriche §  ad esempio, le classi Quadrato e Cerchio per rappresentare

rispettivamente quadrati e cerchi §  le caratteristiche delle forme geometriche sono le seguenti

•  i quadrati sono caratterizzati da un lato e da un colore •  i cerchi sono caratterizzati da un raggio e da un colore •  i quadrati devono saper calcolare il proprio lato, il proprio

colore e la propria area •  i cerchi devono saper calcolare il proprio raggio, il proprio

colore e la propria area §  Viene definita la classe (astratta) Forma che dichiara e/o

definisce tutte le caratteristiche comuni delle classi Quadrato e Cerchio

Page 37: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 37

La classe astratta Forma /** Una forma geometrica. */ abstract class Forma { /** Il colore della forma. */ protected String colore; /** Crea una nuova Forma di un certo colore. */ public Forma(String colore) { this.colore = colore; } /** Restituisce il colore della forma. */ public String getColore() { return colore; } /** Restituisce l'area della forma. */ public abstract double getArea(); // ogni forma deve saper calcolare la propria area }

Page 38: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 38

La classe Quadrato /** La forma geometrica quadrato. */ class Quadrato extends Forma { /** Il lato del quadrato. */ protected double lato; /** Crea una nuovo Quadrato. */ public Quadrato(double lato, String colore) { super(colore); this.lato = lato; } /** Restituisce il lato del quadrato. */ public double getLato() { return lato; } /** Restituisce l'area del quadrato. */ // implementa il metodo astratto area() public double getArea() { return lato*lato; } }

Page 39: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 39

La classe Cerchio /** La forma geometrica cerchio. */ class Cerchio extends Forma { /** Il raggio del cerchio. */ protected double raggio; /** Crea una nuovo Cerchio. */ public Cerchio(double raggio, String colore) { super(colore); this.raggio = raggio; } /** Restituisce il raggio del cerchio. */ public double getRaggio() { return raggio; } /** Restituisce l'area del cerchio. */ // implementa il metodo astratto area() public double gatArea() { return raggio*raggio*Math.PI; } }

Page 40: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 40

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.getArea()); // 25 System.out.println(q.getColore()); // bianco System.out.println(q.getLato()); // 5 System.out.println(fq.getArea()); // 100 System.out.println(fq.getColore()); // rosso System.out.println(fq.getLato()); // NO, errore // di compilazione!

Page 41: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 41

Classi astratte e polimorfismo . . . q Caratteristiche dell’esempio mostrato

§  la classe Forma è stata dichiarata abstract perché contiene la dichiarazione del metodo astratto area()

•  la classe astratta Forma non può essere istanziata direttamente

§  le classi Quadrato e Cerchio sono “concrete” perché estendono la classe Forma e ne implementano tutti i metodi astratti

•  le classi Quadrato e Cerchio possono essere istanziate

Page 42: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 42

. . . Classi astratte e polimorfismo q Una variabile di tipo Forma

§  può memorizzare il riferimento a una forma (un quadrato o un cerchio)

§  può essere usata per invocare un metodo definito da Forma — ad esempio, colore()

§  può essere usata per invocare un metodo astratto dichiarato da Forma — ad esempio, area()

Page 43: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 43

Interfacce q In Java, una interfaccia (interface) è una unità di

programmazione che consiste nella dichiarazione di un certo numero di metodi d’istanza e pubblici, che sono implicitamente astratti §  in prima approssimazione, una interfaccia è simile a

una classe astratta che dichiara solo metodi astratti, senza fornire alcuna implementazione

q Una classe implementa una interfaccia se implementa (definisce) tutti i metodi d’istanza dichiarati dall’interfaccia

Page 44: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 44

Esercizi

q Riesaminare le domande poste inizialmente circa il tipo Razionale e il tipo Coppia

q Definire il tipo Coppia e il tipo Razionale utilizzando i meccanismi di ereditarietà visti

q Definire il tipo Complesso come sottotipo del tipo Coppia

Page 45: Corso di Laurea Ingegneria Informatica Fondamenti di ... · java/fondinf/ Ereditarietà 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà

http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà 45

Riferimenti

q Per ulteriori approfondimenti si può fare riferimento al Capitolo 25 del libro di testo