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 :

Instanciation conditionnelle d'un objet


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 46
    Par défaut Instanciation conditionnelle d'un objet
    Bonjour
    J'ai une question concernant le polymorphisme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    abstract class Mere
    {
       public Mere(){}
       public abstract void MyMethod();
    }
     
    class Fille1 : Mere
    {
       public Fille1(){}
       public override void MyMethod(){//implementation 1}
    }
    class Fille2 : Mere
    {
        public Fille2(){}
        public override void MyMethod(){//implementation 2}
    }
    puis quand je fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Mere Inst_Mere;
    if (cond1)
    {
       Inst_Mere = new Fille1();
    }
    else(cond1)
    {
       Inst_Mere = new Fille2();
    }
     
    Inst_Mere.MyMethod();
    il me sort:

    "Use of unassigned local variable Inst_Mere"
    Est-ce que l'instanciation dans une structure conditionnelle n'est pas permise?

    Y'a-t-il une manière plus propre d'implémenter le polymorphisme de méthodes en C#?

    Merci pour vos eclaircissements.

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2005
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 131
    Par défaut
    Bonjour,

    Utilise le design pattern Factory ou sercvice Locator.cad tu responsabilise une autre class pour créer l'objet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    public class MereFactory(){
     
    public Mere CreateMere(boolean cond1){
     
    if (cond1)
     
      return  new Fille1();
     
    else
     
        return new Fille2();
     
     
    }
     
     
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 46
    Par défaut
    je me lance ...

  4. #4
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    * création directe
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    Mere Inst_Mere = new Fille1();
    * conditionnelle, version longue
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Mere Inst_Mere = null; //IMPORTANT le null
    if(condition1)
    {
      Inst_Mere = new Fille1();
    }
    else if(condition2)
    {
       Inst_Mere = new Fille2();
    }
    else
      Inst_Mere = ... ?
    * cas où il n'y a que deux conditions, condition1 et !condition1, trop sympa :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    Mere Inst_Mere = condition1 ? new Fille1() : new Fille2();
    Ce qui est équivalent à la structure du haut ...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 46
    Par défaut
    merci pour votre aide Mehdi_ab et smyley.

  6. #6
    Membre éprouvé
    Inscrit en
    Mars 2005
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 131
    Par défaut
    à votre service

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Citation Envoyé par geeksideofme Voir le message
    il me sort:
    "Use of unassigned local variable Inst_Mere"
    Juste pour préciser, cette erreur en particulier arrive si tu as un chemin où ta variable Inst_Mere est utilisée sans être instanciée, ce qui est le cas dans ton test. Donc soit initialiser à null, soit virer la condition du else (ou en ajouter un autre sans condition).

    Après évidemment c'est plus 'propre' par Abstract Factory interposée, mais dans l'absolu, il ne fallait pas grand chose pour que ton code initial fonctionne sans erreur :)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/04/2009, 21h21
  2. instancier un tableau d'objet
    Par mazodo dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 14/08/2008, 11h33
  3. Réponses: 7
    Dernier message: 21/09/2007, 15h26
  4. Réponses: 7
    Dernier message: 16/09/2007, 17h26
  5. Réponses: 5
    Dernier message: 23/02/2006, 14h18

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