Newsgroup: it.comp.lang.visual-basic
Titolo: Overrides vs Overloads vb.net

Ciao a tutti,
Ho cercato un po' di documentazione in internet ed ho constatato che
non sono l'unico che ha grossi problemi di comprensione della
differenza tra la due cose.
Tutt'e due servono ad avere metodi con firme identiche dentro a classi
ereditate ma come si comportano uno rispetto all'altro?
Grazie mille per le vostre risposte, Babbomarci

 ereditate ma come si comportano uno rispetto all'altro?
Non è totalmente vero:
Overrides ti permettere di *sovrascrivere*, appunto, un metodo
ereditato.
Per farti un esempio, se hai una classe che eredita da Object (piu
generale di così...) e vuoi sovrascrivere il metodo ToString (che è
presente nella classe Object ed è dichiarato come Overridable, cioè
sovrascrivibile) dovrai usare la parola chiave Overrides.
Overloads indica invece il *sovraccarico* di un metodo nella stessa
classe. In parole povere, se hai una cosa così:
  Private Overloads Sub Spara()
  End Sub
  Private Overloads Sub Spara(ByVal Ammazza As Boolean)
  End Sub
allora il codice che verrà eseguito dipenderà dalla firma che
specifichi quando chiami il metodo. In questo caso, se non specifichi
niente verrà eseguito il primo, altrimenti se specifichi un parametro
booleano (qualunque sia il suo valore) verrà eseguito il secondo.
La parola chiave Overloads è opzionale, ma se la inserisci una volta
devi metterla anche a tutti gli altri metodi coinvolti.
Ciao!

 ereditate ma come si comportano uno rispetto all'altro?
Ti hanno spiegato già il funzionamento.
Per farti un esempio pratico su Overloads metti che vuoi fare una funzione
che da una variabile formatti la stringa per il Database. Con VB6 devi fare
un variant come parametro e vedere di che tipo è.
Con l'overload puoi fare
Function Var2SQL (str as string)
Function Var2SQL (Importo as currency)
Function Var2SQL (Intero as integer)
ecc.
A seconda del parametro che utilizzi si utilizza la funzione differente.
Per l'overrides poi c'è anche un discorso più complesso che riguarda MyBase
e MyClass se non erro, e che sarebbe bene avere a mente prima di utilizzare
le classi derivate.
Es. se ridefinisci la "funzione Età" dalla classe base, e poi utilizzi una
funzione della classe che la richiama (esempio di balena "Function
PuòVotare as boolean), potresti avere un comportamento inaspettato.
Parti da qui:
http://msdn.microsoft.com/it-it/library/20fy88e0.aspx


Grazie mille, spiegazione molto chiara. Probabilmente non mi era
chiara perché l'overloads lo eseguo spesso senza indicarlo sul codice.
Grazie ancora, Babbomarci

 Parti da qui:
http://msdn.microsoft.com/it-it/library/20fy88e0.aspx
Grazie anche ad Andrea, adesso vado subito a leggermi la
documentazione postata
Ciao ciao

 documentazione postata
Mi sono accorto che lě poi c'č un link che rimanda ad una spiegazione piů
dettagliata.
Per fartela breve se una classe derivata ridefinisce un metodo, viene
sempre utilizzato quello ridefinito, almeno che non si usi MyClass.
Classe base
  Function Age
	Age=17
  end f
  Function PuoVotare as boolean
    A) If Age>=18 then PuoVotare=True
    B) If MyClass.Age>=18 then PuoVotare=True
  end f
End Class
Classe Derivata
   Function Age
	Age=30
   end f
End Class
Dim base as new base
Dim der as new derivata
A)
print base.puovotare -> FALSE
print der.puovotare -> TRUE
B)
print base.puovotare -> FALSE
print der.puovotare -> FALSE

 Mi sono accorto che lì poi c'è un link che rimanda ad una spiegazione più

Si, avevo notato anch'io quello che mi spieghi infatti spesso mi trovo
a fare il controllo con typeOf:
dim vBase as Base = ccc
if TypeOf vBase is derivata then
directcast(vbase,Derivata).puovotare
else
vbase.puovotare
end if
In questa maniera sono sempre nel giusto,anche se come maniera di
lavorare non mi piace molto perché per farlo è necessario conoscere
sia la classe derivata che la classe base.
è possibile farlo in altro modo?


Magari ho capito male quello che intendi, ma il codice qui sopra non è
necessario, anzi va proprio contro il concetto di ereditarietà che
vuole che tu non sia tenuto a conoscere l'esistenza di tutte le
derivate per invocare un metodo base in override.
se vBase è stata dichiarata come classe base, ma istanziata come
classe derivata, allora "vbase.puovotare" invoca il metodo della
classe derivata senza bisogno di fare alcun cast.
Quello che diceva Andrea è un problema legato non tanto all'override
dei metodi in se, quanto all'uso di 'MyClass' e 'MyBase' la cui
differenza va tenuta presente... in particolare MyClass, che ha
utilizzi molto particolari (e in linea di massima meno frequenti)