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

C# Discussion :

Classe, reflexion, type, dynamic, duck typing


Sujet :

C#

  1. #1
    Isher
    Invité(e)
    Par défaut Classe, reflexion, type, dynamic, duck typing
    Bonjour,

    J'ai vainement chercher à trouver une solution à ce problème sur le net mais pê que je donne pas les bons mots clés.

    Voici mon problème.

    J'ai 5 ou 6 classes déjà définies de manière externes, indépendantes les unes des autres et sans parents communs. Cependant, elles partagent une quinzaine de propriétés en commun. Ces classes sont fournies par un web service et je suis obligé de les utiliser pour consommer ce service.

    Je souhaiterai faire une classe de base pour initialiser la quinzaine de propriétés communes mais je ne sais pas comment prototyper cette méthode Init(). En effet, le paramètre ne sera jamais du même type et si on le détermine à posteriori, à partir d'un type "Object", les propriétés ne sont pas connues avant l'exécution.

    J'ai bien pensé faire une classe de base personnelle avec un wrapper pour chaque classe mais je voulais éviter cette possibilité que je trouve fastidieuse.

    Avez-vous une idée de comment procéder?

    Merci d'avance pour vos réponses

    Et j'en profite également pour remercier tous les contributeurs de ce site, je pose rarement des questions ici car je trouve toujours un post qui y répond, donc je vous lis bcp.

    --
    Eric

    EDIT: adaptation du titre pour les moteurs de recherche après résolution.
    Dernière modification par Isher ; 09/12/2011 à 17h42.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 196
    Par défaut
    tu peux faire un classHelper avec
    InitWebServiceItem(Class1 cl1) {}
    InitWebServiceItem(Class2 cl2) {}

    ajouter des methodes d'extention à tes class

    et regarder du coté du pattern Decorator

  3. #3
    Isher
    Invité(e)
    Par défaut
    Oui, j'ai bien pensé à cette classe "helper" mais je devrais recopier dans chaque méthode init, l'initialisation commune, sans compter que s'il y a une modification, un bug ou un changement de version, il faudra le reporter sur toutes les méthodes init.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 196
    Par défaut
    a part créer l'héritage du coté client via une interface tu as pas bcp d'autres solutions sinon:

    le décorateur mais ca veut dire faire:
    DecoClass1 : Class1,IMyInterface
    DecoClass2 : Class2 ,IMyInterface

    et si tu veux que Init soit défini qu'a un endroit tu dois aussi faire une class helper "ClassHelper.Init(IMyInterface)"

    mais c'est assez lourd aussi

    Bon je suis pas un maitre des design pattern qq'un d'autre aura peut-être une autre solution

  5. #5
    Isher
    Invité(e)
    Par défaut
    En fait je voyais plus une solution à l'aide de la reflexion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    void Init(object LeParametre){
     
    dynamic oMaClasseGenerique;
     
    sTypeParametre = LeParametre.GetType().ToString();
     
    switch(sTypeParametre){
     
       case "ClasseA":
          oMaClasseGenerique = LeParametre as ClasseA;
          break;
     
       case "ClasseB":
          oMaClasseGenerique = LeParametre as ClasseB;
          break;
     
       case "ClasseC":
          oMaClasseGenerique = LeParametre as ClasseC;
          break;
       default:
          throw(new InvalidParameterException());
          break;
    }
    Je viens de penser à la variable "dynamic", je vais tester si ça marche.

  6. #6
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Ce dont tu as besoin, ca s'appelle le duck typing. Je connais mal le sujet, mais tu dois pouvoir te débrouiller avec le mot-clé dynamic; il existe aussi des libs de duck typing, comme LinFu.

    D'ailleurs, la page wikipedia a même un exemple en C#

  7. #7
    Isher
    Invité(e)
    Par défaut
    Merci guulh, avec ce "duck typing", je n'ai même pas besoin de reflexion (qui au passage fonctionnait assez bien ) , l'exemple de wikipedia est parfait.

    EDIT: A noter pour le lecteur de passage, que le duck typing ne fonctionne que depuis la version 4 en C#, version qui marque l'apparition du mot clé "dynamic" à moins que la lib Linfu permette de contourner cette limitation.
    Dernière modification par Isher ; 09/12/2011 à 18h27.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 08/10/2008, 10h58
  2. [PRO*C] ANSI Dynamic SQL - type objet
    Par maxtin dans le forum Interfaces de programmation
    Réponses: 3
    Dernier message: 11/04/2008, 16h19
  3. Organisation des classes dans un jeu de type Mario
    Par peijnoob dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 16/01/2008, 21h08
  4. Classe de base d'un type généric
    Par mister3957 dans le forum C#
    Réponses: 6
    Dernier message: 23/05/2007, 13h13
  5. Réponses: 2
    Dernier message: 06/12/2005, 09h41

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