JavascriptProva

mercoledì 31 luglio 2013

Overloading di un metodo.

Cerchiamo di giocare con l'overload e l'override...
Si tratta di argomenti un tantino confusivi...

Iniziamo con una classe incredibilmente semplice...
Module Module1

    Sub Main()
        Dim miaClasse As New Classe
        miaClasse.metodo()


    End Sub

End Module

Class Classe
    Sub metodo()
        Console.WriteLine("Io sono la classe base")
        Console.ReadKey()

    End Sub
End Class
Output:
Io sono la classe base



Adesso creiamo una classe derivata:
    Sub Main()
        Dim miaClasse As New Classe
        miaClasse.metodo()


    End Sub

End Module

Class Classe
    Sub metodo()
        Console.WriteLine("Io sono la classe base")
        Console.ReadKey()

    End Sub
End Class

Class Derivata
    Inherits Classe

    Sub metodo()
        Console.WriteLine("Io sono la classe derivata")

    End Sub
End Class
Nel metodo della classe derivata ottengo una segnalazione di errore:
"sub 'metodo' nasconde un membro che supporta l'overload dichiarato nella class base 'Classe'. Per eseguire l'overload del metodo di base, quest'ultimo deve essere essere dichiarato 'Overloads' "
Che significa tutto questo?
Significa probabilmente che posso eseguire l'overload del metodo 'metodo', ossia avere due metodi con lo stesso nome ma con diversi parametri, il che significa la possibilità di usare uno stesso metodo con diversi parametri.
Per fare questo, devo dichiarare questo metodo della classe derivata "overloads".

Proviamo...
Module Module1

    Sub Main()
        Dim miaClasse As New Classe
        miaClasse.metodo()
        Dim miaDerivata As New Derivata
        miaDerivata.metodo()

    End Sub

End Module

Class Classe
    Sub metodo()
        Console.WriteLine("Io sono la classe base")
        Console.ReadKey()

    End Sub
End Class

Class Derivata
    Inherits Classe

    Overloads Sub metodo()
        Console.WriteLine("Io sono la classe derivata")
        Console.ReadKey()

    End Sub
End Class
Ho semplicemente dichiarato Overloads il metodo della classe derivata, senza modificarne i parametri.
Non mi pare che la cosa abbia poi molto senso.
L'output è il seguente:
Io sono la classe base
Io sono la classe derivata




In pratica, quando istanzio la classe base, viene eseguito il metodo della classe base, mentre quanto istanzio la classe derivata viene eseguito il metodo della classe derivata. E' come se usassi l'override, in cui il metodo della classe derivata sostituisce il metodo della classe base...

Proviamo a modificare i parametri...
Module Module1

    Sub Main()
        Dim miaClasse As New Classe
        miaClasse.metodo()
        Dim miaDerivata As New Derivata
        miaDerivata.metodo()

    End Sub

End Module

Class Classe
    Sub metodo()
        Console.WriteLine("Io sono la classe base")
        Console.ReadKey()

    End Sub
End Class

Class Derivata
    Inherits Classe

    Overloads Sub metodo(ByVal parametro As String)
        Console.WriteLine("Io sono la classe derivata")
        Console.ReadKey()

    End Sub
End Class
Ecco, ora ho fatto un vero overload, ossia nella classe derivata avrò due metodi, uno senza parametri e uno con un parametro di tipo String.
E se istanzio la classe derivata eseguendone il metodo senza parametri, mi verrà eseguito il metodo della classe base:
Io sono la classe base
Io sono la classe base


Invece adesso provo ad eseguire, dopo aver istanziato la classe derivata, il metodo con parametro di tipo String e vediamo:
    Sub Main()
        Dim miaClasse As New Classe
        miaClasse.metodo()
        Dim miaDerivata As New Derivata
        miaDerivata.metodo("Ciao ciccio")

    End Sub
Ecco l'output:
Io sono la classe base
Io sono la classe derivata


Perfetto!
Con l'Overload posso avere un metodo da usare in modo versatile, con numero e tipo diverso di parametri.

Ovviamente posso overloadare un metodo anche nell'ambito della stessa classe:
Module Module1

    Sub Main()
        Dim miaClasse As New Classe
        miaClasse.metodo()
        miaClasse.metodo(123)
        miaClasse.metodo(345, "Fesso")

    End Sub

End Module

Class Classe
    Sub metodo()
        Console.WriteLine("Io sono il metodo senza parametri")
        Console.ReadKey()

    End Sub

    Sub metodo(ByVal parametro As Integer)
        Console.WriteLine("Io sono il metodo con parametro")
        Console.ReadKey()

    End Sub

    Sub metodo(ByVal parametro As Integer, ByVal parametro2 As String)
        Console.WriteLine("Io sono il metodo con due parametri")
        Console.ReadKey()
    End Sub
End Class
Output:
Io sono il metodo senza parametri
Io sono il metodo con parametro
Io sono il metodo con due parametri


Ecco l'overloading!

Nessun commento:

Posta un commento