IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langages Discussion :

Fonction, interfaces héritées et dispatch


Sujet :

Langages

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut Fonction, interfaces héritées et dispatch
    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

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    Salut,

    le probleme vient de la conception: c'est a l'implementation de tes interfaces d'effectuer le code, pas a ta classe appellante. en d'autres tu essaies de changer de comportement en fonction du type d'objet passe en parametre, mais c'est le 'type' d'objet lui meme qui devrait implementer le code.

    Donc a part un switch case, ecrit d'une maniere ou d'une autre je ne vois pas commente realiser ce que tu veux faire.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Salut Mermich,

    Niveau conception, tout dépend ce que tu recherches. Pour le coup, ces interfaces sont des contrats permettant le transport de données (DTO) donc dénués de toute logique fonctionnelle. La conception est donc correcte.
    Cela dit, nous avons fait le choix d'opter pour les surcharges.
    Plutot que d'avoir un seul point d'entrée public et un dispatch derriere, nous avons plusieurs points d'entrée (autant qu'il y a de dérivées) et ensuite on fait la sauce à partir de là.
    Ce qui donne grosso modo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public Function DoWork(int As IInheritedInterface1) As String
            Return "work for inherited Interface1 Object"
        End Function
     
        public Function DoWork(int As IInheritedInterface2) As String
            Return "work for inherited Interface2 Object"
        End Function

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    Ouais, j'imaginais un truc du genre.

    Donc tu pourras pas te passer d'un switch ecrit d'une maniere ou d'une autre:

    • getType().GetInterfaces()
    • test via le 'is'
    • crado via try cast /try catch

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    au temps pour moi, j'avais oublié de modifier les interfaces des arguments (que je viens de corriger dans mon message précédent).
    A partir du moment où tu types avec les interfaces dérivées, ça roule, pas besoin de reflection

Discussions similaires

  1. Mêmes méthodes dans deux interfaces héritées
    Par ShaiLeTroll dans le forum C++Builder
    Réponses: 0
    Dernier message: 25/07/2011, 18h24
  2. Réponses: 7
    Dernier message: 10/11/2006, 09h03
  3. Réponses: 6
    Dernier message: 04/08/2006, 11h24
  4. DRIVER - fonctions dispatch - soucis de compilation
    Par - Robby - dans le forum Windows
    Réponses: 1
    Dernier message: 26/01/2006, 21h13
  5. [Interface] Appeller toutes les méthodes héritées d'un class
    Par thibaut.d dans le forum Général Java
    Réponses: 4
    Dernier message: 25/01/2005, 08h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo