ereditarietà e polimorfismo - prof.accarino.altervista.org e... · ereditarietà la classe che è...

23
Ereditarietà e Polimorfismo Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Upload: duongnhan

Post on 24-May-2018

217 views

Category:

Documents


2 download

TRANSCRIPT

Ereditarietà e

Polimorfismo

Prof. Francesco Accarino

IIS Altiero Spinelli

Via Leopardi 132 Sesto San Giovanni

Ereditarietà

L’ereditarietà è lo strumento che permette di

costruire nuove classi utilizzando quelle già

sviluppate

Quando una classe viene creata attraverso il

meccanismo di ereditarietà a partire da

un’altra classe, essa riceve in eredità tutti gli

attributi e i metodi della classe generatrice

Prof. Francesco Accarino 2Ereditarietà e Polimorfismo

Ereditarietà

La classe che è stata derivata da un’altra usando l’ereditarietà prende il nome di sottoclasse. La classe generatrice di una sottoclasse si chiama sopraclasse

Queste relazioni tra le classi individuano una gerarchia che nasce da un processo di specializzazione. Infatti le classi che si trovano in cima alla gerarchia sono le più generali e man mano che si scende si trovano classi più specializzate

Prof. Francesco Accarino 3Ereditarietà e Polimorfismo

Ereditarietà

Mezzi di trasporto

Veicoli a motore Mezzi non a motore

Auto Moto Autobus Bicicletta Cavallo

Prof. Francesco Accarino 4Ereditarietà e Polimorfismo

Ereditarietà

La sottoclasse eredita dalla sopraclasse tutti gli attributi e tutti i metodi con la possibilità di inserire le differenze.

La nuova classe si differenzia dalla sopraclasse in due modi:

- per estensione, quando la sottoclasse aggiunge nuovi

attributi e metodi che si sommano a quelli ereditati

- per ridefinizione, quando la sottoclasse ridefinisce i

metodi ereditati, viene cioè data un’implementazione

diversa di un metodo

Prof. Francesco Accarino 5Ereditarietà e Polimorfismo

Ereditarietà

L’ereditarietà serve a definire nuove classi,

derivate da altre, che ereditano gli attributi e i

metodi, con la possibilità di ridefinirli o di

aggiungerne di nuovi.

Esistono due tipi di ereditarietà:

- singola e multipla

Prof. Francesco Accarino 6Ereditarietà e Polimorfismo

Ereditarietà

Si parla di ereditarietà singola quando una

sottoclasse deriva da un’unica sopraclasse

sopraclasse

sottoclasse sottoclasse

Prof. Francesco Accarino 7Ereditarietà e Polimorfismo

Ereditarietà

Si parla di ereditarietà multipla quando una

classe deriva da due o più sopraclassi

Mezzi di trasporto Animali

Cavallo

Prof. Francesco Accarino 8Ereditarietà e Polimorfismo

Ereditarietà

In java l’ereditarietà è singola.

Questo risolve tutta una serie di problemi

legati i nomoi delle variabili dell’ereditarietà

mutipla ma restringe in qualche modo lo

sviluppo di gerarchie di classi.

Questa limitazione è in qualche modo

superata come vedremo più avanti dalle

interfacce

Prof. Francesco Accarino 9Ereditarietà e Polimorfismo

Polimorfismo Il polimorfismo indica la possibilità per i metodi di

assumere forme, cioè implementazioni, diverse all’interno della gerarchia delle classi

Tutti i veicoli a motore possiedono il metodo accelera

- Le sottoclassi automobile e moto ereditano il metodo accelera, ma è probabile che lo ridefiniscano per adeguarlo alle particolari esigenze

- Il metodo accelera dell’automobile si manifesterà con la pressione del pedale, mentre nella moto sarà implementato con il movimento della manopola

Queste due diverse implementazioni evidenziano l’aspetto polimorfico del metodo accelera

Prof. Francesco Accarino 10Ereditarietà e Polimorfismo

Polimorfismo

Durante l’esecuzione del programma, un’istanza della

classe veicoli a motore può rappresentare sia una

automobile che una moto

Non è possibile sapere, prima dell’esecuzione, se si

tratta di una automobile o di una moto

Il collegamento dinamico garantisce che, richiamando

il metodo, tra tutte le implementazioni venga scelta

quella corretta che corrisponde all’oggetto interessato

Prof. Francesco Accarino 11Ereditarietà e Polimorfismo

Esempio: la classe Persona

Si consideri ad esempio la seguente classe

Persona

un oggetto Persona rappresenta una persona

l’unica proprietà di una Persona è il suo nome

nome è una variabile d’istanza (privata)

è possibile costruire una nuova Persona che ha

un certo nome

la classe Persona ha un costruttore parametrico

rispetto al nome

Prof. Francesco Accarino 12Ereditarietà e Polimorfismo

La classe Persona

class Persona {

/* il nome. */

private String nome;

/* crea una Persona, dato il nome. */

public Persona(String nome) {

this.nome = nome;

}

/* restituisce il nome della Persona. */

public String getNome() {

return this.nome;

}

/* restituisce una descrizione della Persona. */

public String toString() {

return "Mi chiamo " + this.getNome() + ". ";

}

}

Prof. Francesco Accarino 13Ereditarietà e Polimorfismo

Esempio: la classe Studente

Si supponga ora di voler definire la seguente

classe Studente

un oggetto Studente rappresenta uno studente

dell’ITIS

le proprietà di uno Studente sono il suo nome e il

nome della classe che frequenta

è possibile costruire un nuovo Studente che ha

un certo nome e frequenta una certa classe

la classe Studente ha un costruttore parametrico

rispetto al nome e alla classe frequentata

Prof. Francesco Accarino 14Ereditarietà e Polimorfismo

Dalla classe Persona alla classe studente

La classe Studente estende e specializza il

comportamento della classe Persona

la classe Studente modella 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

Prof. Francesco Accarino 15Ereditarietà e Polimorfismo

Dalla classe Persona alla classe studente

Definiamo allora la classe Studente estendendo la

classe Persona

l’estensione di classi riduce il tempo di

realizzazione,riutilizzando implicitamente il codice

già scritto

l’estensione di classi presenta anche altri vantaggi,

che saranno descritti nel seguito

La sintassi per definire una classe ereditata è:

class <ClasseEstesa> extends <ClasseBase>

Prof. Francesco Accarino 16Ereditarietà e Polimorfismo

La classe Studenteclass Studente extends Persona {

/* la clase frequentata */

private String classe;

/* crea uno Studente, dati: nome e classe. */

public Studente(String nome, String classe){

super(nome);

this.classe = classe;

}

/* restituisce la classe dello Studente. */

public String getClasse(){

return this.classe;

}

/* restituisce una descrizione dello Studente. */

public String toString() {

return "Mi chiamo " + this.getNome() + ". “+

"Studio nella " + this.getClasse() +".";

}

}

Nota: le proprietà e i metodi

pubblici della classe

Persona

vengono automaticamente

ereditati dalla classe

Studente

Prof. Francesco Accarino 17Ereditarietà e Polimorfismo

La parola chiave super

La parola chiave super si può usare in un metodo di istanza

per referenziare la ―parte dell’oggetto this‖ definita dalla

super-classe (nell’esempio, la parte Persona di un oggetto

Studente)

Il metodo toString() di Studente si può ad esempio riscrivere

in forma più breve nel seguente modo:

/* restituisce una descrizione dello Studente. */

public String toString() {

return super.toString() +

"Studio nella " + this.getClasse +".";

}

Prof. Francesco Accarino 18Ereditarietà e Polimorfismo

Aspetti dell’estensione: metodi

la classe estesa eredita implicitamente tutti i metodi

definiti nella classe base la classe estesa può ridefinire i metodi della classe

base (overriding o sovrascrittura)

— ad esempio, toString()

se la classe estesa non ridefinisce un metodo della

classe base, allora vuol dire che ne conferma

implicitamente la definizione

— ad esempio, getNome()

la classe estesa può definire nuovi metodi

– adesempio getClasse()

Prof. Francesco Accarino 19Ereditarietà e Polimorfismo

Aspetti dell’estensione: variabili

la classe estesa possiede implicitamente

tutte le variabili della classe base

la classe estesa può accedere alle variabili

pubbliche della classe base, ma non può

accedere alle variabili private

Prof. Francesco Accarino 20Ereditarietà e Polimorfismo

Aspetti dell’estensione: construttori

i costruttori della classe estesa tipicamente:

1. invocano un costruttore della classe base (usando

la parola chiave super) per inizializzare le variabili

dichiarate nella classe base; se ciò non viene fatto,

è automaticamente richiamato il costruttore con

parametri nulli (se non presente viene generato un

errore)

2. inizializzano le variabili dichiarate nella classe

estesa

Prof. Francesco Accarino 21Ereditarietà e Polimorfismo

Ereditarietà e polimorfismo

Un aspetto fondamentale dell’estensione di classi

(e dell’ereditarietà in generale) è il polimorfismo

è possibile assegnare il riferimento ad un oggetto della classe estesa a una variabile il cui tipo è la classe base ad esempio si può assegnare il riferimento di un

oggetto Studente ad una variabile di tipo Persona

a tale oggetto è possibile richiedere solo il

comportamento definito dalla classe base

tuttavia, il comportamento dell’oggetto viene scelto al

tempo di esecuzione sulla base del tipo effettivo

dell’oggetto, e non sul tipo della variabile (binding

dinamico)

Prof. Francesco Accarino 22Ereditarietà e Polimorfismo

Polimorfismo: esempio

Persona alunno = new Studente(―Franco‖, ―4IA‖);

System out.writeln(alunno.toString());

Stamperebbe:

Mi chiamo Franco. Studio nella 4IA.

e non:

Mi chiamo Franco. Del metodo Persona

out.writeln(alunno.getClasse()); // NO, ERRORE!

Prof. Francesco Accarino 23Ereditarietà e Polimorfismo