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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    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 : 43
    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
    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 éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 93
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    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 : 43
    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
    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 émérite Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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
    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.

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