Cast et conversion objet C#
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Cast et conversion objet C#



  1. #1
    221

    Cast et conversion objet C#


    ------

    bonjour a tous

    quelqu un pourrait m'éclairer sur la notion de cast dans le contexte suivant :

    Code:
    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 .

    -maintenant 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:
    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 (et dsl pour le pavé ).

    -----

  2. #2
    invite0bbe92c0

    Re : Cast et conversion objet C#

    Bonjour

    Citation Envoyé par 221 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 ?
    Je ne comprends pas ta question. J'ai l'impression que tu confonds le type de stockage (Animal) avec le type de l'instance (Chien).
    Ici l'instance n'est pas convertie : la "conversion" ne marche que si l'instance stockée dans Animal est de type Chien. (ou d'un type dérivé de Chien).

    Accessoirement, depuis le C# 3.0, tu peux utiliser les notions de covariance et de contravariance de type sur les classes génériques. (donc les listes génériques).
    Voir ici : https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx

  3. #3
    221

    Re : Cast et conversion objet C#

    merci pour la réponse bluedeep.

    je vais essayer de la poser plus clairement selon ce que j ai compris: quand on ajoute l objet de la classe Chien dans la liste animaux ,il se produit une conversion implicite ,l objet est converti de sa condition initiale d'objet Chien a Objet de la classe Animal et il est stocké dans l élément animal de la liste (il n est plus Chien ) comment on a pu reconnaître que c etait un objet de la classe chien en testant l élément animal de la liste en lequel il a eté converti ?

  4. #4
    invite0bbe92c0

    Re : Cast et conversion objet C#

    Citation Envoyé par 221 Voir le message
    merci pour la réponse bluedeep.

    je vais essayer de la poser plus clairement selon ce que j ai compris: quand on ajoute l objet de la classe Chien dans la liste animaux ,il se produit une conversion implicite ,l objet est converti de sa condition initiale d'objet Chien a Objet de la classe Animal et il est stocké dans l élément animal de la liste (il n est plus Chien ) comment on a pu reconnaître que c etait un objet de la classe chien en testant l élément animal de la liste en lequel il a eté converti ?
    Si il est toujours Chien justement; c'est juste son container qui est de type Animal, mais l'instance stockée est de type Chien.
    Comme la variable container (ici la liste générique) est d'un type pére du type Chien, il n'y a aucun problème, mais l'instance stockée est bien de type Chien. (d'autant qu'ici on peut suppose que par design Animal est une classe abstraite doc non instanciable).

    Quand tu stock dans "Animal" il n'y a pas de conversion car une instance Chien est aussi de type Animal. C'est le principe de l'héritage, ce n'est pas propre au C#; on retrouve cela dans tous les langages objet (tu n'as pas donné la définition des classes mais on suppose que Chat et Chien héritent de Animal).

  5. A voir en vidéo sur Futura
  6. #5
    221

    Re : Cast et conversion objet C#

    ok
    quand tu parles de container tu parles enfaîte de la variable contenant l adresse de l objet, en d autre termes variable qui pointe l instance Chien ?

    dans ce cas la conversion d un objet ( d une classe a une autre) consiste a encapsuler la variable référence pointant l objet en question dans un container de type classe vers laquelle on veut convertir ?

    merci

  7. #6
    invite0bbe92c0

    Re : Cast et conversion objet C#

    Citation Envoyé par 221 Voir le message

    dans ce cas la conversion d un objet ( d une classe a une autre) consiste a encapsuler la variable référence pointant l objet en question dans un container de type classe vers laquelle on veut convertir ?
    Il me semblait pourtant avoir été clair : quand une instance x est de type A1 qui hérite du A, il n'y a pas de conversion (et c'est valable aussi pour une interface).

    le test "is" fonctionnera pour Chien comme pour Animal

    Exemple (compile et exécute, tu verras bien) :

    Code:
    class Program
        {
            static void Main(string[] args)
            {
                B b = new B();
                if (b is A)
                    Console.WriteLine("b is A");
                if (b is B)
                    Console.WriteLine("b is B");
                Console.ReadKey();
            }
    
    
        }
    
    
        class A
        {
            public int V = 10;
        }
    
    
        class B : A
        {
        }

  8. #7
    221

    Re : Cast et conversion objet C#

    ok je comprend mieux .
    mais je disais conversion par rapport a la définition de msdn :

    Conversions implicites : aucune syntaxe spéciale n'est requise parce que la conversion est de type sécurisé et que les données ne seront pas perdues. Les exemples incluent des conversions de types intégraux en d'autres, plus importants, et des conversions de classes dérivées en classes de base.

    https://msdn.microsoft.com/fr-fr/library/ms173105.aspx


    merci.

  9. #8
    invite0bbe92c0

    Re : Cast et conversion objet C#

    Citation Envoyé par 221 Voir le message
    ok je comprend mieux .
    mais je disais conversion par rapport a la définition de msdn :

    Conversions implicites : aucune syntaxe spéciale n'est requise parce que la conversion est de type sécurisé et que les données ne seront pas perdues. Les exemples incluent des conversions de types intégraux en d'autres, plus importants, et des conversions de classes dérivées en classes de base.

    https://msdn.microsoft.com/fr-fr/library/ms173105.aspx


    merci.
    J'ignorais que Microsoft utilisait le terme "conversion" dans ce cas; je ne trouve pas ça très judicieux car c'est un peu ambigüe : en effet, il est possible de faire porter une véritable conversion d'un objet A à un objet B quand ils n'ont pas de hiérarchie d'héritage commun (et cette conversion peut être explicite ou implicite au choix). On fait cela par surcharge de l'opérateur de cast.

Discussions similaires

  1. C# cast d'un objet en interface
    Par invited8c72a90 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 17/02/2012, 13h00
  2. cast d'un pointer sur une fonction membre
    Par klark dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 13/09/2011, 18h17
  3. [Biochimie] Cast
    Par invite7ea9f5b9 dans le forum Biologie
    Réponses: 0
    Dernier message: 26/05/2011, 09h35
  4. Cast sur C18
    Par thundertom dans le forum Électronique
    Réponses: 7
    Dernier message: 29/08/2010, 17h46