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
Top Related