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 classe de base en classe derivée


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 21
    Par défaut cast classe de base en classe derivée
    Bonjour à tous,

    Alors voilà: dans un projet, j'utilise des web services qui me renvoient des objets de classe A. Ces objets sont des objets passifs (sans méthodes ni evenements).
    La definition de classe A m'est fournie dans le fichier Reference.cs créé au moments ou j'ajoute la reference au fichier wsdl du webservice.

    Pour utiliser ces objets dans mon programme, je voulais deriver une classe B de classe A et ajouter des methodes. jusque là pas de soucis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class ClasseB :ClasseA
    {
        public void MaMethode()
        {
        }
    }
    Lors de l'appel au Webservice, j'obtient en retour un objet de classe A sur lequel je voudrait pouvoir lancer MaMethode().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ClasseB objetB = AppelWebService();
    objetB.MaMethode();
    J'obtient une erreur de compillation: Impossible de convertir implicitement le type ClasseA en ClasseB. Une convertion explicite existe (Un cast est-il manquant ?)

    Losque j'essaie de forcer le cast, j'ai une exception InvalidCastException à l'execution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ClasseB objetB = (ClasseB)AppelWebService();
    objetB.MaMethode();
    J'ai donc essayé de redefinir un operateur de cast implicit (ou explicit), et à la compilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static implicit operator ClasseB(ClasseA objectA)
    {
    // Opérations de convertion manuelles
    }
    Et j'ai a nouveau une erreur à la compilation:
    ClasseB.implicit operator ClasseB(ClasseA): convertion definie par l'utilisateur vers/de la classe de base.

    Je ne sait plus comment m'y prendre, je fais donc appel à vos lumières.
    Toutes les idées sont les bienvenues.

    Merci d'avance.
    n0n0

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Lorsque tu as classe B qui dérive d'une classe A, tu peux faire :
    Mais pas :
    Donc aucun cast ne marchera !!! Il faut que tu le fasse toi même.
    Tu récupère l'instance de A et tu affectes aux attibuts de ton instance de B les valeurs des attributs de A.

    Je n'avais pas vu la fin peux tu donner l'erreur de compilation ?

  3. #3
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    Exact, a ta place, j'exposerais une méthode statique sur la classe B CreateFromClassA.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClassB objB = ClassB.CreateFromClassA(AppelWebService());

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Très bonne solution.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 21
    Par défaut
    Citation Envoyé par neptune Voir le message
    Exact, a ta place, j'exposerais une méthode statique sur la classe B CreateFromClassA.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClassB objB = ClassB.CreateFromClassA(AppelWebService());
    Bien vu...
    Je n'avais pas pensé à ca.

    Ou un constructeur de ClasseB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public ClasseB(ClasseA objetA)
    A voir....
    Merci
    n0n0

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 21
    Par défaut
    Merci ced600 de ta reponse rapide.
    Tu récupère l'instance de A et tu affectes aux attibuts de ton instance de B les valeurs des attributs de A.
    C'est ce que je voulais faire en créant mon operateur de convertion implicite ou explicite, mais il ne veux pas d'operateur de casting entre la classe de base et la classe derivée.
    En plus, si je doit copier tous les attributs de objetA vers objetB, je me retrouve avec 2 objets ayant les memes propriétés.

    De plus si le fournisseur du webservice change la structure de ClasseA (ajoute des attributs par ex), je doit réécrire la procedure de convertion.

    Quitte a ecrire un truc pas très propre je crois que je vais me rabattre sur un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class B
    {
        private classA m_objetA;
        public int attribut1
        {
            get { return m_objetA.attribut1; }
            set { m_objetA.attribut1 = value; }
        }
        ....
        public void MaMethode()
        {
        }
    }
    Ca a au moins le merite de n'avoir qu'un seul objet en memoire...

    Ou alors j'edite le reference.cs et je rajoute partial à toutes les definitions de classes, ce qui me permet de les completer ensuite dans un fichier à moi...

    Mais aucune de ces solution ne me parrait vraiment "propre".

    Et je ne comprend pas pourquoi je ne peut pas definir un cast de la classe de base vers la classe derivée.

    D'autres idées??
    n0n0

  7. #7
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Dans ton opérateur implicite de cast, que fais tu ? (mais le code entier)
    Parce que vu ta réponse j'ai un doute sur ton but dans la création de to opérateur de cast implicite.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 21
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Dans ton opérateur implicite de cast, que fais tu ? (mais le code entier)
    Parce que vu ta réponse j'ai un doute sur ton but dans la création de to opérateur de cast implicite.
    Super simple, je crée un nouvel objet classeB et je lui affecte tous les attributs de l'objetA passé en parametre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static implicit operator ClasseB(ClasseA p_ObjetA)
    {
        ClasseB objetB = new ClasseB();
        objetB.attribut1 = p_objetA.attribut1;
        ....
        return objetB;
    }
    J'ai donc en memoire l'objetA passé en parametre et l'objetB qui est retourné.

  9. #9
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Oui donc c'est la même chose que ce que je t'ai proposé. Sauf que j'avais pas précisé dans quelle methode mettre cela.
    Une méthode static ou un constructeur cela me parait adapté à la situation.

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

Discussions similaires

  1. [Débutant] Lire une classe héritée dans une classe de base
    Par BasicZX81 dans le forum VB.NET
    Réponses: 7
    Dernier message: 06/12/2013, 15h37
  2. accéder à classe dérivée via une classe de base
    Par wirenth dans le forum Langage
    Réponses: 6
    Dernier message: 28/09/2011, 11h23
  3. Réponses: 2
    Dernier message: 02/02/2008, 07h37
  4. Réponses: 7
    Dernier message: 29/11/2007, 16h03
  5. Réponses: 8
    Dernier message: 20/07/2007, 14h28

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