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 :

Cast et conversion objet


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut Cast et conversion objet
    bonjour a tous

    quelqu un pourrait m'éclairer sur la notion de cast dans le contexte suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    List<Animal> animaux = new List<Animal>();
    Chien chien = new Chien();
    Chat chat = new Chat();
     
    animaux.Add(chien);
    animaux.Add(chat);
     
    foreach (Animal animal in animaux)
    {
        animal.Respirer();
    }
    on a une classe mère (Animal)dont dérivent deux classes filles(Chien,Chat) , on crée une liste du type de la classe mère et on voudrait mettre les objet des deux classes filles dedans et les utiliser en tant qu objet de la classe mère ,ce qui implique une conversion implicite des objet classes filles vers objet classe base ,donc les objets de la liste sont logiquement des type Animal .

    -dans la liste on veut pouvoir repérer parmi les objets Animal ceux qui ont anciennement été de la classe Chien(ceux converti a partir de la classe chien) , ce qui peut se faire en utilisant un if dans la liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach (Animal animal in animaux)
    {
        if (animal is Chien)
        {
            Chien c = (Chien)animal;
            c.Aboyer();
        }
     
    }
    ma question : comment on a pu tester dans le if si l'élément de la liste( qui est forcement un type Animal) est un type Chien ou a anciennement été un type Chien vu que l objet Chien a eté converti implicitement en intégrant la liste animaux ?

    en d'autre terme qu est ce qui peut indiquer que c était un chien ?

    merci (dsl pour le pavé ).

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    L'objet chien reste un Chien, mais un Chien est aussi un Animal ce qui lui permet d'être ajouter à ta liste animaux.
    Il n'y à donc pas de conversion, tout les animaux respire mais seul les Chien aboie.


    https://msdn.microsoft.com/fr-fr/library/ms173149.aspx
    Lorsque vous définissez une classe à dériver d'une autre classe, la classe dérivée obtient implicitement tous les membres de la classe de base, à l'exception de ses constructeurs et destructeurs.La classe dérivée peut ainsi réutiliser le code dans la classe de base sans avoir à le réimplémenter.Dans la classe dérivée, vous pouvez ajouter davantage de membres.De cette manière, la classe dérivée étend la fonctionnalité de la classe de base

  3. #3
    Membre éprouvé
    Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 127

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Citation Envoyé par chadoum Voir le message
    Je pense que l'on en est pas encore la, il s'agit d'héritage simple.
    Le polymorphisme implique une réécriture/écrasement de méthode qui selon le type peut sortir des résultats différents.
    Quelqu'un d'autre peut donner sont avis dessus ?

  5. #5
    Membre éprouvé
    Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 127
    Par défaut
    En fait la définition du polymorphisme est pour moi le fait qu'un objet peut être de plusieurs types.
    Au moment de l'exécution, les objets d'une classe dérivée peuvent être traités comme des objets d'une classe de base dans les paramètres de méthode et les collections ou les tableaux.Lorsque cela se passe, le type déclaré de l'objet n'est plus identique à son type au moment de l'exécution.
    Sa manifestation (ou ce que le polymorphisme permet de faire) c'est de réécrire les méthodes de la classe de base (substitution).
    Les classes de base peuvent définir et implémenter des méthodes virtuelles et les classes dérivées peuvent les substituer, ce qui signifie qu'elles fournissent leur propre définition et implémentation

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Je pense que l'on en est pas encore la, il s'agit d'héritage simple.
    Le polymorphisme implique une réécriture/écrasement de méthode qui selon le type peut sortir des résultats différents.
    Quelqu'un d'autre peut donner sont avis dessus ?
    La méthode Respirer() implique du polymorphisme puisque chien et chat ont pu surcharger la méthode (quoi que tous les mamifères respirant de la même façon, la méthode sera a priori implémentée dans la classe de base). Maintenant, je suis d'accord, tester que l'animal est un chien relève de l'héritage pur et simple.

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Bonjour à tous,

    ma question : comment on a pu tester dans le if si l'élément de la liste( qui est forcement un type Animal) est un type Chien ou a anciennement été un type Chien vu que l objet Chien a eté converti implicitement en intégrant la liste animaux ?
    Faux !

    Pour moi, en tout cas c'est ma vision des choses, Tu as déclaré un Chien, ton object est donc un chien, à tout moment, le fait de le mettre dans une liste d'Animal ne lui retire pas son type Chien, mais le limite au type Animal, acquis par héritage. D'ailleurs si on veut être plus proche de la machine quand tu as instancier un new Chien() tu as créé en mémoire les éléments permettant de faire vivre/fonctionner ce Chien (et donc y compris les éléments d'Animal acquis par héritage) sauf que le fait de l'utiliser en tant qu'Animal fait que l'accès aux éléments de Chien (or élément de Animal) ne sera plus possible.
    C'est d'ailleurs comme ça que fonctionne le polymorphisme, si j'appelle un élément de la classe de base qui a été surchargé alors j'arrive dans l'élément surchargé même si l'object est utilisé dans le context de la classe de base (car en mémoire j'ai bien tout ce qui est utile à la classe fille)

    en d'autre terme qu est ce qui peut indiquer que c était un chien ?
    C'est un Chien c'est juste que le fait de l'ajouter dans une liste d'Animal limite son utilisation à cette classe de base, comme si on le bridait, mais dès qu'on le remet dans le contexte d'origine alors il retrouve toutes ses fonctionnalités.

    Bon au final quand je me relis j'ai pas l'impression d'être claire... mais ça fera peut être avancer le chmilibilibilique

    J@ck.

  8. #8
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    https://msdn.microsoft.com/fr-fr/library/ms173152.aspx
    En C#, chaque type est polymorphique, car tous les types, y compris les types définis par l'utilisateur, héritent de Object.
    Pas faut, mais alors ça ne sert a rien d'utiliser ce terme si il est commun à tout les types et ne veut en soi rien dire
    Int, string, ... sont des polymorphes.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Par défaut
    Int, string, ... sont des polymorphes.
    non.

    un INT est une structure et STRING une classe sealed sans héritage. il ne sont donc pas polymorphe (et heureusement!!)


    pour ma part je rejoind un peux vos 2 avis sauf que je me base plus sur le contexte.

    3 classes animal / chien / chat avec de l'héritage reste pour moi de l'héritage

    si on commence à mélanger la notion de chien et de chat via animal alors cela deviens du polymorphisme car on considère un objet comme possédant plusieurs "facette"

    cette vision (plus que définition) correspond également à l'idée du code réécrit car si on ne considère pas un chien comme un animal alors que la méthode soit sur-chargée ou non nous importe peux...

  10. #10
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    https://msdn.microsoft.com/fr-fr/library/ms173152.aspx
    En C#, chaque type est polymorphique, car tous les types, y compris les types définis par l'utilisateur, héritent de Object.
    Ce n'est pas moi qui l'invente d’ailleurs ce code fonctionne correctement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int aa = 5;
    object bb = (object)aa;
     
    struc rr = new struc();
    object tt = (object)rr;
     
    public struct struc
    {
    }
    Ce n'est pas pacque les structures n'ont pas d’héritage et les classes sont sealed qu'elle ne profite pas d'un héritage de niveau supérieur ou interne au dot.net.
    Non ?

    Par contre je rejoins ta façon de voir de contexte, d’ailleurs un polymorphe doit changer de façon selon la façon dont on le regarde l'utilise (c'est peut être la définition ?)

  11. #11
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Citation Envoyé par ws495 Voir le message
    ma question : comment on a pu tester dans le if si l'élément de la liste( qui est forcement un type Animal) est un type Chien ou a anciennement été un type Chien vu que l objet Chien a eté converti implicitement en intégrant la liste animaux ?

    en d'autre terme qu est ce qui peut indiquer que c était un chien ?
    Parce que ton objet est de type Chien. En fait, quand tu l'as ajouté dans ta liste d'objet il n'a pas modifié ton objet. Il a juste stocké son adresse mémoire. Ta liste étant typée Animal tu ne pourras agir dessus qu'avec les propriétés de ton animal (pour le tri par exemple). En revanche, tu peux très bien récupérer ton objet pour le traiter en tant que Chien (ce que tu as fais avec le "Is")

  12. #12
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    https://msdn.microsoft.com/fr-fr/library/ms173152.aspx


    Ce n'est pas moi qui l'invente d’ailleurs ce code fonctionne correctement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int aa = 5;
    object bb = (object)aa;
     
    struc rr = new struc();
    object tt = (object)rr;
     
    public struct struc
    {
    }
    Ce n'est pas pacque les structures n'ont pas d’héritage et les classes sont sealed qu'elle ne profite pas d'un héritage de niveau supérieur ou interne au dot.net.
    Non ?
    Pas tout à fait d'accord. Un int est un type valeur stocké sur la pile alors que object référence une zone mémoire stocké sur le tas. L'exemple de convertion de int en object (c'est du boxing) est d'ailleurs décrit dans Msdn.
    Ici, l'object bb fera référence à un une nouvelle copie sur le tas de aa et non pas à aa proprement dit. Si tu modifies la valeur de aa, bb ne sera pas modifié contrairement à une même manipulation avec un objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int aa = 5;
    object bb = aa;
    aa = 6;     // bb référence une copie de aa donc reste à 5
     
    myClass cc = new myClass();
    cc.num = 5;
     
    object dd = cc;
    cc.num = 6; // dd pointant sur cc sera modifié

  13. #13
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    D'accord mais est ce que ça prouve quelque chose ?

    https://msdn.microsoft.com/fr-fr/library/9kkx3h3c.aspx
    Dans le système de type unifié de C#, tous les types, prédéfinis et définis par l'utilisateur, les types référence et les types valeur, héritent directement ou indirectement de Object. Vous pouvez assigner des valeurs de tout type à des variables de type object. Lorsqu'une variable d'un type valeur est convertie en objet, elle est dite boxed. Lorsqu'une variable de type objet est convertie en un type valeur, elle est dite unboxed

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut
    eh bien messieurs on peut dire qu il ya eu débat .
    merci pour vos réponses c'est beaucoup plus clair maintenant.

Discussions similaires

  1. cast d'un objet vers des types dynamiques
    Par aymen007 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 25/06/2008, 10h31
  2. Réponses: 2
    Dernier message: 06/03/2007, 20h38
  3. [POO] Erreur suite à un cast sur un objet
    Par RogerB dans le forum Langage
    Réponses: 3
    Dernier message: 02/11/2006, 14h56
  4. [C#] Evenements & cast de l'objet Sender
    Par Yannick038 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 29/09/2006, 16h34
  5. Cast d'un objet d'une TObjectList
    Par maredami dans le forum Langage
    Réponses: 21
    Dernier message: 23/03/2006, 17h16

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