Bonjour à tous,

Je suis bloqué sur un truc et je cherche à trouver une solution "élégante" :
J'ai une classe métier avec un point d'entrée DoWork qui attend un parametre typé as IInterfaceBase.
Dans cette classe j'ai deux fonctions privées : DoWorkA(arg as IInterfaceA) et DoWorkB(arg as IInterfaceB)
InterfaceA et InterfaceB héritent de IInterfaceBase.
J'aimerai que quand j'envoie un objet implémentant IInterfaceA dans DoWork, cela puisse router vers DoWorkA et quand j'envoie un objet implémentant IInterfaceB dans DoWork, j'aimerai qu'il aille dans DoWorkB.
Malheureusement, ça n'a pas l'air de fonctionner comme ça dans la vraie vie.
Voici le bout de code qui illustre mes propos :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
    Public Function DoWork(argument As IBaseInterface) As String
        Return Consume(argument)
    End Function
 
    Private Function Consume(int As IBaseInterface) As String
        Return "work for Base Interface Object"
    End Function
 
    Private Function Consume(int As IInheritedInterface) As String
        Return "work for inherited Interface Object"
    End Function
Quand j'appelle DoWork, quel que soit le type de l'argument, je passerai toujours dans la fonction Consume typée (IBaseInterface).
La façon moins élégante de coder cela serait de modifier DoWork comme ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
 Public Function DoWork(argument As IBaseInterface) As String
        Select Case True
            Case TypeOf argument Is IInheritedInterface
                Return Consume(DirectCast(argument, IInheritedInterface))
            Case TypeOf argument Is IBaseInterface
                Return Consume(DirectCast(argument, IBaseInterface))
        End Select
    End Function
Le problème est que cet exemple est très simpliste. Quand on a plusieurs arguments typés "interface de base" ça peut vite devenir très moche. Et puis bon, j'ai bon espoir qu'il y ait une solution bien plus lisible que ça !
Si vous avez une idée... je suis preneur
Merci d'avance