Site:  Cours VB.net  
5.9 Surcharge.

Quand on utilise une méthode avec des paramètres, il y a parfois possibilité d'utiliser, avec la même méthode, un nombre différent de paramètres ou des paramètres de nature différente: on appelle cela surcharger la méthode.

Chaque manière d'écrire les paramètres s'appelle une signature.

Exemple:

Voici une fenêtre MessageBox:  

 pour  ouvrir une fenêtre MessageBox il y a 12 signatures, en voici 2:

Reponse= MessageBox.show(TexteAAfficher,Titre, TypeBouton etIcone, BoutonParDéfaut)
Ici on donne 4 paramètres.
 

Reponse= MessageBox.show(TexteAAfficher)

Ici 1 seul paramètre.

On voit qu'on peut appeler la méthode MessageBox.Show avec un nombre différent de paramètres.

Comme on ne peut pas connaître toutes les signatures, VB nous aide:

Si on tape R= MessageBox.show(  VB affiche dans un cadre une signature, de petites flèches permettent de faire défiler tous les autres signatures: 

Quand on crée une Classe, il est bien sur possible d'écrire une property ou un constructeur qui accepte la surcharge: 

Surcharge en VB 2003

 

1- On peut surcharger un constructeur.

Pour  cela il suffit de rajouter autant de procédure New que l'on veut avec pour chacune un nombre de paramètre différent (signatures différentes).

 

Exemple: On peut surcharger un constructeur:

 

Class Figure

Sub New()

    Bla Bla

End Sub

 

Sub New( ByVal X As Integer, ByVal Y As Integer)

     Blabla

End Sub.

End Class

 On peut donc instancier la classe correspondante de 2 manières:

Dim A As New Figure    'Constructeur par défaut

ou

Dim A As New Figure(100,150)

 

2- On peut surcharger une property.

Pour  cela il suffit de rajouter des procédure Property ayant le même nom de méthode avec pour chacune un nombre de paramètre différent (signature différente)

On peut ajouter Overloads mais c'est facultatif.

Exemple: surchargeons un membre:

Class Figure

Public Overloads Property Calcul()

    Bla Bla

End Sub

 

Public Overloads Property Calcul( ByVal X As Integer, ByVal Y As Integer)

     Blabla

End Sub.

End Class

 

c'est un bon exemple de polymorphisme.

Surcharge en VB 2005: nouveautés

On peut surcharger les opérateurs + - * / mais aussi _ ^ & Like And Or Xor Not < > = << >>  Ctype IsTrue, IsFalse

Exemple: surchargeons l'opérateur +
Public Structure height
    ...
    Public Shared Operator +(ByVal h1 As height, ByVal h2 As height)As height
        Return New height(h1.feet + h2.feet, h1.inches + h2.inches)
    End Operator
End Structure

La routine doit être Shared, de plus si on surcharge certains opérateurs, il faut aussi surcharger leur inverse: si on surcharge '>' , il faut surcharger '<'.

Surcharge de IsTrue, IsFalse Ctype

Si on teste un boolean, il a la valeur True ou False.

Si par contre je crée une classe nommée 'Personne', je peux définir comment une instance sera considérée comme égale à True. Il faut surcharger l'opérateur IsTrue en lui indiquant dans quelle condition l'instance sera considérée comme =True:

Exemple:

J'ai une instance e de type Personne, si e.Present =True, dans ce cas je veux que e soit considéré comme True; il faut écrire dans la Classe 'personne':

Public Shared Operator IsTrue(ByVal e As Personne) As Boolean

If e Is Nothing Then

    Return False

Else

    Return e.Present

End If

End Operator

 

Pour définir l'opérateur IsFalse, c'est simple: c'est Not e

 

Public Shared Operator IsFalse(ByVal e As Personne) As Boolean

    Return Not e

End Operator

 

 

 

Ensuite je pourrais utiliser des instructions de la forme:

If e then..

 

Surcharge de Ctype:

Je peux définir dans une classe comment CType va fonctionner:

Pour cela dans la classe Personne, je vais définir les 3 possibilités:

Public Shared Widening Operator CType(ByVal e As Personne) As String

Return e.Nom + " " + e.Prenom

End Operator

 

Public Shared Widening Operator CType(ByVal  e As Personne) As Date

If e Is Nothing Then

    Return Nothing

Else

    Return e.DateDeNaissance

End If

End Operator

 

Public Shared Widening Operator CType(ByVal  e As Personne) As Boolean

    If e Is Nothing Then Return False Else Return e.Present

End Operator

Ainsi

Ctype(UnePersonne,String) retourne  Nom Prenon

Ctype(UnePersonne,Date) retourne  la date de naissance

Ctype(UnePersonne,Boolean) retourne  True ou False.

Les exemples  sont des surcharges, car le type des paramètres est modifié.