Override: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m +{{W}}
Migliorato la pagina
 
(33 versioni intermedie di 22 utenti non mostrate)
Riga 1:
{{F|programmazione|febbraio 2013}}
{{W|argomento=informatica|mese=dicembre 2006|firma=[[Utente:Beta16|&beta;<sub>16</sub>]] - ([[Discussioni utente:Beta16|talk]]) 11:30, 7 dic 2006 (CET)}}
{{S|programmazione}}
Nella programmazione ad oggetti assume notevole importanza la possibilità di potere creare classi a partire da classi già esistenti (ereditarietà).
[[File:Method overriding in subclass.svg|miniatura|Immagine che mostra l{{'}}''override'' di un metodo]]
La classe nuova che eredita quella esistente può avere metodi ereditati che possono essere riscritti per le nuove necessità.
LNella [[programmazione orientata agli oggetti]], l{{'}}'''''override''''' è un'operazione di riscrittura di un [[Metodo (programmazione)|metodo]] ereditato[[Ereditarietà si chiama Override(informatica)|ereditato]].
 
In essa assume notevole importanza la possibilità di creare [[Classe (informatica)|classi]] a partire da classi già esistenti (ereditarietà). La classe nuova che eredita quella esistente può avere metodi ereditati che possono essere riscritti per le nuove necessità.
 
== Esempio in Java ==
Definiamo ora la prima classe, <code>Punto</code>:
 
<syntaxhighlight lang="java" line="1">
public class Punto {
private int a, b;
 
public Punto (int a, int b) {
this.a = a;
this.b = b;
}
 
public void setA (int a) {
this.a = a;
}
 
public int getA () {
return a;
}
 
public void setB (int b) {
this.b = b;
}
 
public int getB () {
return b;
}
 
public double distanza_origine () {
int x = (a*a)+(b*b);
return Math.sqrt(x);
}
 
}
</syntaxhighlight>
 
Ora implementiamo invece la classe <code>Punto3D</code> che eredita dalla classe <code>Punto</code>
 
<syntaxhighlight lang="java" line="1">
public class Punto3D extends Punto {
private int c;
 
public Punto3D (int a, int b, int c) {
super (a, b);
this.c = c;
}
 
public void setC (int c) {
this.c = c;
}
 
public int getC () {
return c;
}
 
public double distanza_origine () {
int x = (getA() * getA()) + (getB() * getB()) + (c * c);
return Math.sqrt(x);
}
}
</syntaxhighlight>
 
È stato possibile ridefinire il blocco di codice del metodo <code>distanza_origine()</code> per introdurre la terza coordinata ([[Variabile (informatica)|variabile]] <code>c</code>), affinché il calcolo della distanza sia eseguito correttamente nella classe <code>Punto3D</code>.
La chiamata al [[Costruttore (informatica)|costruttore]] della [[Superclasse (informatica)|superclasse]] è avvenuta attraverso una [[sintassi]] speciale che sfrutta il {{Codice|codice=super|linguaggio=Java}}. Tale istruzione ({{Codice|codice=super(a, b)|linguaggio=Java}}) deve essere la prima del costruttore e non potrà essere inserita all'interno di un metodo che non sia un costruttore.
 
L{{'}}''override'' impone delle regole da seguire:
* Il metodo ridefinito ha la stessa forma del metodo originale della superclasse;
* Il metodo ridefinito nella [[Sottoclasse (informatica)|sottoclasse]] non deve essere meno accessibile del metodo originale della superclasse. Per esempio, se un metodo ereditato è dichiarato protetto, non si può ridefinire privato, semmai pubblico;
* Il tipo di ritorno del metodo deve coincidere con quello del metodo che si sta riscrivendo.
 
In realtà, dalla [[Java 5|versione 5 di Java]] in poi, il tipo di ritorno del metodo può coincidere anche con una sottoclasse del tipo di ritorno del metodo originale. In questo caso si parla di "tipo di ritorno covariante". Per esempio, sempre considerando il rapporto di ereditarietà che sussiste tra le classi <code>Punto</code> e <code>Punto3D</code>, se nella classe <code>Punto</code> fosse presente il seguente metodo:
 
<syntaxhighlight lang="java" line="1">public Punto getAddress() {
return this;
}</syntaxhighlight>
 
allora sarebbe legale implementare il seguente L{{'}}''override'' nella classe <code>Punto3D</code>
 
<syntaxhighlight lang="java" line="1">
public Punto3D getAddress() {
return this;
}
</syntaxhighlight>
 
== Annotazione sull'override ==
Uno degli errori più comuni che può commettere un programmatore è sbagliare un ''override''. Ovvero ridefinire in maniera non corretta un metodo che si vuole riscrivere in una sottoclasse, magari digitando una lettera minuscola piuttosto che maiuscola, o sbagliando il numero di parametri in [[input]]. in tali casi il [[compilatore]] non segnalerà errori, dal momento che non può intuire il tentativo di ''override'' in atto. Quindi, per esempio, il seguente codice in Java:
 
<syntaxhighlight lang="java">
public class MiaClasse {
...
public String tostring() { // per avere l'override, si dovrebbe scrivere toString e non tostring
...
}
}
</syntaxhighlight>
 
è compilato correttamente, ma non sussisterà nessun ''override'' in <code>MiaClasse</code>. Il grosso problema è che questo errore si presenterà in fase di esecuzione e non è detto che lo si riesca a correggere velocemente. Per ovviare a questo problema, occorre utilizzare l'[[Annotazione (Java)|annotazione]] {{Codice|codice=@Override|linguaggio=Java}} presente nel [[Package (Java)|package]] {{Codice|codice=java.lang.|linguaggio=Java}}. Tale annotazione serve a marcare i metodi che vogliono essere la riscrittura di metodi ereditati. Essa richiede l'uso di un carattere del tutto nuovo alla sintassi Java: <code>@</code><ref>L'annotazione{{Codice|codice=@Override|linguaggio=Java}} in Java 5 è opzionale ma utile.</ref>. Nel nostro esempio, il metodo verrà marcato nel seguente modo:
 
<syntaxhighlight lang="Java">
public class MiaClasse {
...
@Override
public String toString() {
...
}
}
</syntaxhighlight>
Se si violasse qualche regola dell{{'}}''override'', otterremo un errore direttamente in compilazione.
 
== Note ==
<references/>
 
== Collegamenti esterni ==
*{{Collegamenti esterni}}
* {{FOLDOC|overriding|overriding}}
 
{{Controllo di autorità}}
{{Portale|informatica}}
 
[[Categoria:Java]]
[[Categoria:Programmazione]]
[[Categoria:Terminologia informatica]]