Unità didattica 8.1) - Pagina 1
Unità didattica 8.2) - Pagina 2
Unità didattica 8.3) - Pagina 3
Unità didattica 8.4) - Pagina 4
2 - Unità didattica 8.2)
- Costruttori ed ereditarietà
Il fatto che i costruttori non siano ereditati
dalle sottoclassi, è assolutamente in linea con la sintassi del
linguaggio, ma contemporaneamente, è in contraddizione con i
principi della programmazione ad oggetti. In particolare, sembra
violata la regola dell’astrazione. Infatti, nel momento in cui lo
sviluppatore ha deciso di implementare il meccanismo
dell’ereditarietà, ha dovuto testarne la validità mediante la
cosiddetta "is a" relationship. Alla domanda: "un oggetto istanziato
dalla candidata sottoclasse può considerarsi anche un oggetto della
candidata superclasse?", ha infatti risposto affermativamente. Per
esempio nel modulo precedente, avevamo deciso di violare
l’astrazione pur di dare una risposta affermativa alla domanda "un
punto tridimensionale è un punto?". Un punto tridimensionale,
essendo quindi anche un punto, doveva avere tutte le caratteristiche
di un punto. In particolare doveva risfruttarne anche il
costruttore, ma non ereditandolo, l’astrazione sembra violata.
Invece, è proprio in una situazione del genere che Java ci dimostra
quanto sia importante utilizzare la programmazione ad oggetti in
maniera corretta. Aggiungiamo infatti un’altra caratteristica ad un
costruttore:
un qualsiasi costruttore (anche quello di default) come prima
istruzione, invoca sempre un costruttore della superclasse.
Per esempio, rivediamo le classi del modulo precedente:
class Punto
{
private int x,y;
public Punto()
{
System.out.println("Costruito +
punto bidimensionale");
}
. . .
// inutile riscrivere l’intera classe
}
class Punto3D extends Punto
{
private int z;
public Punto3D()
{
System.out.println("Costruito punto
tridimensionale");
}
. . .
// inutile riscrivere l’intera classe
}
Il lettore, avendo appreso che i costruttori non
sono ereditati, dovrebbe concludere che l’istanza di un punto
tridimensionale, mediante una sintassi del tipo
new Punto3D(); //l’assegnazione di un reference non è
//richiesta per istanziare un oggetto.
produrrebbe in output la seguente stringa:
Costruito punto tridimensionale
l’output risultante sarà invece:
Costruito punto bidimensionale
Costruito punto tridimensionale
Il che rende evidente la caratteristica 6) dei costruttori.
L’obbligatoria chiamata ad un costruttore di una superclasse, è
effettuata tramite la parola chiave super, che di seguito è
introdotta al lettore.
Unità didattica 8.1) - Pagina 1
Unità didattica 8.2) - Pagina 2
Unità didattica 8.3) - Pagina 3
Unità didattica 8.4) - Pagina 4