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|programmazione}}
[[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]].
== 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
<
public class MiaClasse {
...
public String 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]]
<
public class MiaClasse {
...
@Override
public String
...
}
}
</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]]
|