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 :

Un transtypage dynamique


Sujet :

C#

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Un transtypage dynamique
    Bonjour,

    Je souhaite réaliser un transtypage dynamiquement. C à d au runtime.

    J'ai une classe Abase et des classe fille B, C, E...

    B, C, E... ont un champs que ne possède pas Abase, qui sera de type Int32 dans B, Float dans C, String dans E etc...

    Au cours du programme une collection Col sera alimenté en Abase.

    Lorsque j'irai récupérer les éléments de cette collection ils seront donc de type Abase or j'aimerai pouvoir, en fonction de leur type "réel", les trier et les transtyper dans leur type d'origine.

    En furetant sur le net j'ai cru comprendre qu'il serait possible de faire cela, au moins le transtypage, via les arbre d'expression mais je doit admettre que sa reste très flou pour moi.

    Quelqu'un peut il m'éclairer à ce sujet ?


  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Ca n'a pas vraiment de sens...

    Le transtypage (cast) n'a de sens qu'à la compilation, si tu sais quelque chose que le compilateur ne sait pas. Par exemple, si tu as une variable a de type Abase, et que tu sais qu'elle contient une instance de type B, tu fais un cast vers B pour pouvoir accéder aux membres de B. Mais en fait, tu n'as pas changé le type de l'objet : il était déjà de type B, tu as juste dit au compilateur ce qu'il ne savait pas (le fait que l'objet est de type B).

    Donc en gros, puisque le cast n'est utile que pendant la compilation, ça n'a pas de sens de vouloir le faire à l'exécution. Si tu veux un traitement différent selon le type de l'objet, la solution la plus propre serait de déclarer une méthode abstraite dans ABase, que tu implémenterais différemment dans chacune des sous-classes.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 93
    Points : 169
    Points
    169
    Par défaut
    Salut,

    Sans connaître ton réel besoin, la solution de tomlev me paraît adapté à ce que tu veux faire. Je te donne quand même un exemple de code avec un cast des éléments d'une liste :

    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
    List<ABase> lst = new List<ABase>();
    lst.Add(new B());
    lst.Add(new C());
    lst.Add(new E());
    ...
    foreach(ABase a in lst)
    {
        if(a is B)
        {
            B b = a as B; // ou B b = (B)a;
            // traitement B
        }
        else if (a is C)
        {
            C c = a as C;
            // traitement C
        }
        else if (a is E)
        {
            E e = a as E;
            // traitement E
        }
    }
    Mais bon ce n'est pas vraiment élégant !

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci pour vos réponses.

    @tomlev
    J'ai bien conscience de tout cela. Et mon but est moins de cast l’élément que de connaitre son type dérivé. En claire savoir si mon Col[x] est un B un C ou un D.

    Et finalement ce que je cherche est...

    @Jaco67
    ... une solution élégante de le faire sans partir sur des if... is... as ou autre switch sur le Name du GetType etc...

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Asaheim Voir le message
    Merci pour vos réponses.

    @tomlev
    J'ai bien conscience de tout cela. Et mon but est moins de cast l’élément que de connaitre son type dérivé. En claire savoir si mon Col[x] est un B un C ou un D.

    Et finalement ce que je cherche est...

    @Jaco67
    ... une solution élégante de le faire sans partir sur des if... is... as ou autre switch sur le Name du GetType etc...
    Bah justement, le polymorphisme ça sert à ça ! Ca te permet d'effectuer un traitement différent selon le type de l'objet, sans avoir à tester s'il est de tel ou tel type. A mon avis la solution que je t'ai proposée répond au besoin.

  6. #6
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Bah justement, le polymorphisme ça sert à ça ! Ca te permet d'effectuer un traitement différent selon le type de l'objet, sans avoir à tester s'il est de tel ou tel type. A mon avis la solution que je t'ai proposée répond au besoin.
    +1.

    L'objet et son type doivent te permettre de résoudre ta problématique. Si ils ont une interface commune ou un héritage ton code doit ressembler à ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    List<ABase> lst = new List<ABase>();
    lst.Add(new B());
    lst.Add(new C());
    lst.Add(new E());
    ...
    foreach(ABase a in lst)
    {
       ABase.ExecuteMonTraitement();
    }
    Si ton polymorphisme est correcte et si tu utilise bien l'héritage (méthode virtuelle) le type résoudra lui même son problème.
    "Le train de tes injures roule sur le rail de mon indifférence."

    "Monde de merde !!"

    Georges Abitbol.

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2008
    Messages : 231
    Points : 359
    Points
    359
    Par défaut
    Et pourquoi pas faire un générique ?

    Tu as une méthode définit dans ABase<T> qui te retourne T.

    class B : ABase<int>
    class C : ABase<float>

    ....

    Ce qui te permet de définir des types dynamiquement sans faire de cast et en implémtant juste la bonne méthode dans les bonne class et en définissant ta méthode générique dans ABase ...
    "Une belle citation est un diamant au doigt de l'homme d'esprit et un caillou dans la main d'un sot."
    Joseph Roux

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par morgand Voir le message
    Et pourquoi pas faire un générique ?

    Tu as une méthode définit dans ABase<T> qui te retourne T.

    class B : ABase<int>
    class C : ABase<float>

    ....

    Ce qui te permet de définir des types dynamiquement sans faire de cast et en implémtant juste la bonne méthode dans les bonne class et en définissant ta méthode générique dans ABase ...
    Il faudrait en savoir un peu plus sur son cas d'utilisation, mais je n'ai pas l'impression que ça convienne... Il a une collection qui contient tous ces objets ABase, donc si cette collection doit contenir à la fois des ABase<int> et des ABase<float>, il faut que ce soit une collection d'une superclasse de ABase<T>... et on revient donc au problème de départ.

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2008
    Messages : 231
    Points : 359
    Points
    359
    Par défaut
    ah le coup de la collection c'est vraiment son cas. ... je pensais que c'était un exemple de code ...

    Peux tu nous donner le cas d'utilisation de ton code ?
    "Une belle citation est un diamant au doigt de l'homme d'esprit et un caillou dans la main d'un sot."
    Joseph Roux

Discussions similaires

  1. Utiliser un transtypage "dynamique"
    Par JPLSOFT dans le forum Composants VCL
    Réponses: 3
    Dernier message: 07/05/2014, 08h49
  2. Transtypage et objet dynamique pour l'interface
    Par TokTokTok dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 04/03/2009, 19h13
  3. Réponses: 3
    Dernier message: 28/01/2009, 14h02
  4. Transtypage dynamique : pré-requis
    Par Somato dans le forum C++
    Réponses: 25
    Dernier message: 06/05/2008, 19h23
  5. [Delphi 7]Transtypage et appels dynamique de methodes
    Par Jabbal'H dans le forum Delphi
    Réponses: 3
    Dernier message: 09/11/2006, 17h46

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