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 mère -> classe fille


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 26
    Points : 15
    Points
    15
    Par défaut Classe mère -> classe fille
    Bonjour, je dispose d'une classe mère A dont hérite plusieurs classe fille B, C, D ... J'ai crée une liste de A dans laquelle je met des B, C ou D. L'idée était de parcourir cette liste et, en fonction du type de l'élément récupéré, effectuer des méthodes ou propriété propre à cette classe.
    J'ai voulu dans un premier temps faire la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    foreach(A a in myListA)
    {
    if(a is B)
    B b = a;
    /* Et puis je fais mes affaires avec b */
    }
    Le problème c'est que malgrés que le test me garantisse qu'il s'agit bien d'un B, l'affectation reste impossible car la machine elle ne le sais pas encore...

    Voila si vous aviez des idées je suis preneuses ^^'
    Je sais pas si je suis très claire ... Je détaillerais un peu plus si besoin est.
    Merci !

  2. #2
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Je crois que la réponse est dans le TRANSTYPAGE (cast en anglais...) ou l'utilisation du mot clef "as"...

    & are your friends !

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par kheironn Voir le message
    Je crois que la réponse est dans le TRANSTYPAGE (cast en anglais...) ou l'utilisation du mot clef "as"...

    & are your friends !
    Hum, même si c'est en cherchant soi-même qu'on se souvient mieux de la solution, en l'occurence c'est assez difficile à chercher sur le net...
    Si tu sais que "a" est du type B, tu dois l'écrire comme ça :Sinon, tu as le mot clé "as", comme le dit kheironn. L'expression (X)x lance une exception si x n'est pas un X. tandis que "x as X" renvoie null si x n'est pas un X.
    Donc tu peux réécrire ton code en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    B b = a as B; if (b != null) { ... }
    Enfin, si tu as accès au framework 3.5 ou 4 ou mieux, tu as Linq a ta disposition, qui contient notamment une méthode ne renvoyant que les éléments d'une liste dérivant d'une certain classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach(B b in myListA.OfType<B>())
    {
     ...
    }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Euh ouai j'avais chercher sur le net avant mais c'était pô très clair :/
    Sinon c'est bizarre j'avais déjà essayé le cast mais ça n'avait pas marché et là ça fonctionne
    En tout cas Linq m'a l'air parfait pour mon problème

  5. #5
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Hum, même si c'est en cherchant soi-même qu'on se souvient mieux de la solution, en l'occurence c'est assez difficile à chercher sur le net...
    Si tu sais que "a" est du type B, tu dois l'écrire comme ça :Sinon, tu as le mot clé "as", comme le dit kheironn. L'expression (X)x lance une exception si x n'est pas un X. tandis que "x as X" renvoie null si x n'est pas un X.
    Donc tu peux réécrire ton code en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    B b = a as B; if (b != null) { ... }
    Enfin, si tu as accès au framework 3.5 ou 4 ou mieux, tu as Linq a ta disposition, qui contient notamment une méthode ne renvoyant que les éléments d'une liste dérivant d'une certain classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach(B b in myListA.OfType<B>())
    {
     ...
    }
    Je suis désolé, mais son compilateur devait ui indiquer un message de convertion implicite impossible... de là, il pouvait chercher.

    Ensuite, sans lui donner la réponse toute faite, je lui ai indiqué ce qu'il devait chercher et "C# as" et "C# transtypage" donne des bons trucs...

    par contre, je ne suis pas familier avec le LinQ, donc je ne connaissais pas la méthode que tu as indiqué... on en apprend tous les jours !

    Au passage, on parle ici de notions de bases de l'héritage, tout de même, voilà pourquoi je ne voulais pas donner de réponse "dans le bec"... tu connais l'histoire de l'homme affamé, du poisson et de la pêche...

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par kheironn Voir le message
    Je suis désolé, mais son compilateur devait ui indiquer un message de convertion implicite impossible... de là, il pouvait chercher.

    Ensuite, sans lui donner la réponse toute faite, je lui ai indiqué ce qu'il devait chercher et "C# as" et "C# transtypage" donne des bons trucs...
    Si elendril avait posé une question basique, avec des mots-clé univoques (du style "c koi la diféranse entre protected et intrenal ???"), j'aurais pas hésité à le rediriger vers google, hein Là, le cast se fait avec des parenthèses, c'est pas googlable, et transtypage est bien moins utilisé que "cast".

    Enfin bon on place tous le curseur entre don de poisson et apprentissage de la pêche un peu différemment.

    Puis refaire un petit topo sur "as" dans ce forum de temps en temps ne fait pas de mal

  7. #7
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    d'autant plus qu'il y a des suptilités avec le as... certes il retourne nul quand ce n'est pas "castable", mais il n'y a pas que ça...

    je pense à cette remarque :
    Notez que l'opérateur as n'effectue que des conversions de référence et des conversions boxing. L'opérateur as ne permet pas d'effectuer d'autres conversions, telles que des conversions définies par l'utilisateur, qui doivent plutôt être effectuées à l'aide d'expressions de cast.
    voir la ref

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/06/2015, 14h07
  2. Caster classe mère et classe fille
    Par zsoufianz dans le forum Général Java
    Réponses: 1
    Dernier message: 02/12/2014, 03h36
  3. Conversion d'une classe mère en classe fille
    Par Aleph69 dans le forum C++
    Réponses: 7
    Dernier message: 07/05/2014, 10h39
  4. caster une classe mère en classe fille
    Par franchouze dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 01/10/2009, 11h56
  5. Lister toutes les sous-classes d'un classe mère
    Par Kerod dans le forum Langage
    Réponses: 10
    Dernier message: 09/02/2009, 19h21

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