Override: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Migliorato la pagina
 
(29 versioni intermedie di 19 utenti non mostrate)
Riga 1:
{{F|programmazione|febbraio 2013}}
{{S|informatica}}
{{S|programmazione}}
Nella [[programmazione ad oggetti]] '''override''' è l'operazione di riscrittura di un [[Metodo (programmazione)|metodo]] ereditato.
[[File:Method overriding in subclass.svg|miniatura|Immagine che mostra l{{'}}''override'' di un metodo]]
Nella [[programmazione orientata agli oggetti]], l{{'}}'''''override''''' è un'operazione di riscrittura di un [[Metodo (programmazione)|metodo]] [[Ereditarietà (informatica)|ereditato]].
 
NellaIn [[programmazione ad oggetti]]essa assume notevole importanza la possibilità di potere creare [[Classe (informatica)|classi]] a partire da classi già esistenti ([[Ereditarietà (informatica)|ereditarietà]]). La classe nuova che eredita quella esistente può avere metodi ereditati che possono essere riscritti per le nuove necessità.
La classe nuova che eredita quella esistente può avere metodi ereditati che possono essere riscritti per le nuove necessità.
 
== Esempio in Java ==
[[Categoria:Programmazione]]
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 javaJava:
 
<sourcesyntaxhighlight lang="Javajava">
public class MiaClasse {
...
public String tostring() { //Si scriveper avere l'override, si dovrebbe scrivere toString e non tostring
...
}
}
</syntaxhighlight>
</source>
 
è 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]] <code> {{Codice|codice=@Override </code>|linguaggio=Java}} presente nel [[Package (Java)|package]] <code>{{Codice|codice=java.lang.</code>|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:
 
<sourcesyntaxhighlight lang="Java">
public class MiaClasse {
...
@Override
public String tostringtoString() { //Si scrive toString e non tostring
...
}
}
</syntaxhighlight>
</source>
Se si violasse qualche regola dell{{'}}''override'', otterremo un errore direttamente in compilazione.
 
== Note ==
Se si violasse qualche regola dell'override, otterremo un errore direttamente in compilazione. Avere un errore in compilazione, ovviamente, è molto meglio che averlo in fase di esecuzione.
<references/>
 
== Collegamenti esterni ==
*{{Collegamenti esterni}}
* {{FOLDOC|overriding|overriding}}
 
{{Controllo di autorità}}
{{Portale|informatica}}
 
[[Categoria:Java]]
[[Categoria:Programmazione]]
[[Categoria:Terminologia informatica]]