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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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")

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, 09h31
  2. Réponses: 2
    Dernier message: 06/03/2007, 19h38
  3. [POO] Erreur suite à un cast sur un objet
    Par RogerB dans le forum Langage
    Réponses: 3
    Dernier message: 02/11/2006, 13h56
  4. [C#] Evenements & cast de l'objet Sender
    Par Yannick038 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 29/09/2006, 15h34
  5. Cast d'un objet d'une TObjectList
    Par maredami dans le forum Langage
    Réponses: 21
    Dernier message: 23/03/2006, 16h16

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