PDA

View Full Version : [Java] Overriding aiuto!


Tony Hak
06-06-2008, 17:17
ciao a tutti ! chiedo scusa ma mi dovreste da una mano da amici! ..nel senso che dovete imboccarmi col cucchiaino che le slide del prof sono molto ambigue e internet è superficiale. Si parla di .. OVERRIDING in Java. Il problema del sovraccaricamento. Sulle slide del prof c'e' secritto solo che :

"Una sottoclasse puo' sovrapporre (???) un metodo ereditato e visibile a patto che, rispetto al metodo della superclasse, il nuovo metodo abbia lo stesso nome, tipo di ritorno e lista di argomenti, visibilita' non inferiore."

Tutte ste cose io le ho capite ma mi trovo in situazioni che pur verificandosi queste regole cmq c'e' un errore di compilazione.

Allora mi chiedo : c'e' altro che dovrei sapere su quest'argomento .. grazie in anticipo a coloro che hanno un po' di pazienza per ris a un inesperto in Java :D

wingman87
06-06-2008, 17:58
Attenzione che l'overriding non è il sovraccaricamento, quello è l'overloading. L'overriding non so come tradurlo, io me l'immagino come una specie di sovrascrittura. Dico specie perché in realtà è sempre possibile richiamare il metodo sovrascritto tramite super.nome_metodo()
Ad ogni modo quello che conta è che una volta che hai "overridato" un metodo questo potrà essere richiamato anche tramite un riferimento più generico (un riferimento con tipo di una superclasse) ti faccio un esempio:
Mettiamo che hai la classica classe Persona con un metodo saluta() che stampa "Ciao".
class Persona{
public void saluta(){
System.out.println("Ciao");
}
}
Ora creiamo la classe Giovane che per salutare dice "Bella!"
class Giovane extends Persona{
public void saluta(){
System.out.println("Bella!");
}
}
Ora posso fare una cosa del genere:
class Prova{
public static void main(String[] args){
Persona tizio=new Giovane();
tizio.saluta();
}
}
tizio saluterà dicendo "Bella!". Nota che tizio è un Giovane referenziato come una Persona, il metodo saluta lo posso richiamare solo perché è definito anche in Persona, se fosse definito solo in Giovane non potrei farlo tramite quel riferimento.

Spero di averti schiarito un po' le idee... Se hai dubbi chiedi pure, magari posta il codice che non ti funziona

nuovoUtente86
06-06-2008, 21:39
Ti avevo, in un' altro post, spiegato già da differenza tra override(ridefinizione) e overloading(sovraccarico) accennandoti anche la covarianza del tipo restituito.

1)Override
Quello che accade è che in una classe derivata venga ridefinito il corpo del metodo(ovvero quello che fa) lasciando invariata la firma con al piu un elevamento dei provileggi d' accesso.

public class Base{
public String toString(){return "base";}}

public class Derivata{
@override
public String toString(){return "derivata";}}

2)Overloading

public class Base{
public String toString(){return "base";}}

public class Derivata{
@override
public String toString(){return "derivata";}

public String toString(String parola){return parola;}}

Come vedi ora nella classe derivata oltre ad essere stato ridefinito il toString(ereditato da Object per tutte le classi) è stato aggiunto un metodo toString che accetta una stringa...quindi è del tutto indipendente dal toString con parametri in ingresso vuoti.

Tony Hak
07-06-2008, 08:47
grazie per le ris.. si effettivamente tempo fa lo chiesi ..ma solo ora mi sto ricordando perche' ho lasciato la programmazione in Java per un bel periodo per problemi vari .. cmq .. ora è tutto un po' piu' chiaro .. pero' vorrei chiedervi ..nel caso in cui si devono gestire delle eccezioni come si comportano l'overriding e l'overloading ? ..

nuovoUtente86
07-06-2008, 10:29
grazie per le ris.. si effettivamente tempo fa lo chiesi ..ma solo ora mi sto ricordando perche' ho lasciato la programmazione in Java per un bel periodo per problemi vari .. cmq .. ora è tutto un po' piu' chiaro .. pero' vorrei chiedervi ..nel caso in cui si devono gestire delle eccezioni come si comportano l'overriding e l'overloading ? ..

Nell' overloading ogni metodo è indipendente e quindi si comporta come meglio piace(o meglio è corretto e utile) al programmatore!

Nell' override bisogna fare attenzione all' utilizzo della clausola throws.
Infatti non è possibile nelle classi derivate dichiarare (attraverso throws) che un metodo (sovrascritto ovviamente) potrebbe sollevare Exception se le stesse non sono dichiarate nella firma del metodo base. Al contrario è possibile nelle ridefinizioni(classi derivate) eliminare la clausola throws utilizzata nella classe base.

Tony Hak
07-06-2008, 10:55
ehm ... nn è che puoi farmi un esempio..cioe' so cosa significa thorws e compagnia bella.. pero' non ho capito bene la tua spiegazione :( .. se mi fai un esempio è meglio :)

nuovoUtente86
07-06-2008, 11:05
è possibile fare questo

public class Base{
public String metodo() throws Exception{return "base";}}

public class Derivata{
@override
public String metodo() throws Exception{return "derivata";}}

oppure
public class Derivata{
@override
public String metodo(){return "derivata";}}


Nota che non ho ridefinito toString in quant implementato in Object senza exception e pertanto non ridefinibiile con clausola throws...Non guardare neanche all' implementazione del metodo...che non ha importanza.


Non è invece possibile fare ciò:

public class Base{
public String metodo() {return "base";}}

public class Derivata{
@override
public String metodo() throws Exception{return "derivata";}}

Tony Hak
07-06-2008, 15:14
capito ... :) domanda : ma questo vale solo per le eccezioni Exception ?

nuovoUtente86
07-06-2008, 15:20
In che senso scusa?

wingman87
07-06-2008, 15:31
capito ... :) domanda : ma questo vale solo per le eccezioni Exception ?
Anche per le sue sottoclassi. Inoltre se vuoi fare l'override di un metodo che lancia una eccezione specifica (ad esempio una IOException) puoi specificare nella clausola throws quella stessa eccezione o una sua superclasse (ad esempio Exception).

nuovoUtente86
07-06-2008, 15:47
Anche per le sue sottoclassi. Inoltre se vuoi fare l'override di un metodo che lancia una eccezione specifica (ad esempio una IOException) puoi specificare nella clausola throws quella stessa eccezione o una sua superclasse (ad esempio Exception).
No non puoi sostituire un Exception specifica (esempio IOException) con una una sua superClasse in quanto in questo modo vai ad aumentare il range delle eccezioni sollevate e la specifica di dice che tale range può essere diminuito o reso vuoto....è consentita la sostituzione, vicerversa, con una sottoclasse.

wingman87
07-06-2008, 15:50
Hai ragione, in effetti non avrebbe senso :)

nuovoUtente86
07-06-2008, 16:00
La puoi vedere dualmente al tipo restituito da un metodo:

se devi restituire un Object(che nel caso delle eccezioni rappresenta la base ovvero Exception)..nulla ti vieta di ritornare una Stringa (nel caso delle eccezioni ipotizziamo IOException)....il contrario ovviamente non è valido.