Override: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Annullate le modifiche di 93.41.60.245 (discussione), riportata alla versione precedente di ValterVBot
Etichetta: Rollback
Migliorato la pagina
 
(9 versioni intermedie di 4 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 adorientata agli oggetti]], l{{'}}'''''override''''' è lun'operazione di riscrittura di un [[Metodo (programmazione)|metodo]] [[Ereditarietà (informatica)|ereditato]].
 
NellaIn [[programmazione ad oggetti]]essa assume notevole importanza la possibilità di 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à.
 
== Esempio in javaJava ==
Definiamo ora la prima classe, <code>Punto</code>:
 
<syntaxhighlight lang="Javajava" line="1">
public class Punto {
private int a, b;
Riga 43 ⟶ 44:
Ora implementiamo invece la classe <code>Punto3D</code> che eredita dalla classe <code>Punto</code>
 
<syntaxhighlight lang="Javajava" 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 reference <code>{{Codice|codice=super</code>|linguaggio=Java}}. Tale istruzione (<code>{{Codice|codice=super(a, b)</code>|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 javaJava]] 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">
<syntaxhighlight lang="java" line="1">public Punto getAddress() {
return this;
}</syntaxhighlight>
}
 
</syntaxhighlight>
allora sarebbe legale implementare il seguente L{{'}}''override'' nella classe <code>Punto3D</code>
 
<syntaxhighlight lang="Java">
<syntaxhighlight lang="Javajava" 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:
 
<syntaxhighlight lang="java">
Riga 101 ⟶ 102:
</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]] <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:
 
<syntaxhighlight lang="Java">
Riga 112 ⟶ 113:
}
</syntaxhighlight>
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.
 
== Note ==
<references/>
 
== Collegamenti esterni ==
*{{Collegamenti esterni}}
* {{FOLDOC|overriding|overriding}}
 
{{Controllo di autorità}}
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.
{{Portale|informatica}}
 
[[Categoria:Java]]
[[Categoria:Programmazione]]
[[Categoria:Terminologia informatica]]