En fait le fil de messages originel est à rechercher sur le forum Access/VBA Access qui évoquait la problématique de l'héritage pour les classes développées en VBA: Héritage, possible ou non?
Donc la discussion a quelque peu dévié sur la question du polymorphisme, et s'est retrouvé déplacée sur le forum Général VBA.
_____---====OOOOO====---
Au risque de déborder un peu sur le sujet originel, je souhaite préciser comment on met en œuvre le polymorphisme en VB/VBA.
D'abord il faut s'entendre sur la signification de polymorphisme.
Aussi, je me reposerai sur Wikipédia avec un court extrait ci-dessous et la suite sur la page de Wikipédia illustrée par un exemple:
Envoyé par Wikipédia
Une classe-interface cForme décrit les méthodes à implémenter pour toutes les "formes" géométriques:
Code : | Sélectionner tout |
1 2 3 4 5 | Option Explicit Public Function Aire() As Double Aire = 0 End Function |
L'utilisation du mot-clé Implements (dans la partie déclaration du module de classe) spécifie qu'une classe implémente l'interface publique (méthodes et propriétés) d'une autre classe.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Option Explicit Implements cForme Private p_nCôté As Double Private Function cForme_Aire() As Double cForme_Aire = p_nCôté * p_nCôté End Function Public Property Get Côté() As Double Côté = p_nCôté End Property Public Property Let Côté(n As Double) p_nCôté = n End Property |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Option Explicit Implements cForme Private p_nRayon As Double Private Function cForme_Aire() As Double cForme_Aire = CDbl(3.1415926535) * p_nRayon * p_nRayon End Function Public Property Get Rayon() As Double Rayon = p_nRayon End Property Public Property Let Rayon(n As Double) p_nRayon = n End Property |
C'est ici que le polymorphisme rentre en jeu puisque, selon le type de "forme", la fonction fait toujours appel à la bonne méthode de calcul Aire(). Tout type de "forme" géométrique qui implémente la classe/interface cForme peut être ajouté sans nécessiter une modification de la fonction AireTotal().
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | Public Function AireTotal(collFormes As Collection) As Double Dim oForme As cForme Dim nTotal As Double nTotal = 0 For Each oForme In collFormes ' la fonction "sait" automatiquement quelle méthode Aire() appeler nTotal = nTotal + oForme.Aire() Next oForme AireTotal = nTotal End Function |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Public Sub TestFormes() Dim oCarré As New cCarré Dim oCercle As New cCercle Dim collFormes As New Collection Dim nTotal As Double oCarré.Côté = 3.4 oCercle.Rayon = 5.1 collFormes.Add oCarré collFormes.Add oCercle nTotal = AireTotal(collFormes) Debug.Print nTotal End Sub |
(1) de coder des procédures "génériques" qu'il ne sera pas nécessaire de modifier pour prendre en compte de nouveaux "sous-types" (exemple la fonction AireTotal()),
(2) d'obtenir un code plus robuste parce que les appels de méthodes sont vérifiés à la compilation (liaison dynamique "late binding" mais avec la rigueur du contrôle de type).
Merci aux courageux et curieux qui ont lu jusqu'au bout.
_