none
Problème avec le constructeur RRS feed

  • Question

  •  

    Je voulais savoir comment faire pour que le constructeur d'une classe retourne null sous certaines conditions, par exemple si les paramètres ne sont pas valides comment retourner un null pour savoir que l'objet n'est pas bien créé ?

    par exemple

     

    public class Youcef

    {

    public Youcef ( int param )

    {

    if(param>0)

    {

    // do traitement, par exempele initialiser des membre de cette classe en fonction de param

    }

    else

    {

    // ici je dois retourner null pour dire que l'objet n'est pas bien crée !!!

    }

    }

    }

     

    Merci

    mardi 20 mai 2008 08:51

Réponses

  • Sinon tu as une astuce décrite ici:

    http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=975373&SiteID=1

    Basé sur le Pattern de la Factory, je recopie le code intéressant pour ceux qui veulent pas aller voir le lien

     

    Cela te permettra en effet de retourner le null que tu souhaites:

    Code Snippet

    public class Something
    {
         private Something(int someInput)
         {
              //Initialize object
         }

         public static void Create(int someInput)
         {
              if(someInput is not valid)
              {
                    return null;

              }
         
              return Something(someInput);

         }

    }

     

     

    Il y a quand même une petite note à lire précisant que cela ne marchera pas bien sur si cette classe Something sera une classe de base pour d'autres. Je pense néanmoins (à vérifier) qu'il y a un design pattern de factory qui réponds à ce problème.

     

    mardi 20 mai 2008 10:00
  •  

    Sauf que le code de Radric ne compile pas : la méthode Create ne pas être "void"... Wink

     

    Bref, la méthode qu'il propose est exactement, celle que je donne plus haut.

     

    Séb

    mardi 20 mai 2008 12:50

Toutes les réponses

  • Bonjour,

     

    il n'est pas possible de retourner une valeur à partir d'un constructeur, tout comme pour une méthode void. Pour résoudre votre problème je vous propose de lever une exception dans votre else, comme cela vous pourrez entourer l'appel de votre constructeur par un try catch et voir facilement que l'objet n'a pas été bien créé.

     

    Voici un lien pour vous y aider :

    http://msdn.microsoft.com/fr-fr/library/1ah5wsex(VS.80).aspx

     

    En espérant avoir pu vous aider.

     

    Audrey

    mardi 20 mai 2008 09:21
  • Bonjour,

    Merci pour votre réponse

    Je connais bien la technique de try cacth finnaly pour traiter les erreurs mais je voulais pas l'utiliser

    si vous avez bien remarqué, par exemple, les types fournis par le framework .Net, si vous instanciez un type avec des mouvais paramètres alors le resultat ne sera pas forcement une exception, mais vous pouvez avoir un objet null aprés sa création. c'est pour cette raison que je voulais savoir comment ils ont fais pour retourner null ?

     

    Merci

     

    mardi 20 mai 2008 09:37
  • Dans ce cas, vous pouvez essayer d'utiliser un type nullable pour les propriétés que vous souhaitez mettre à null dans votre constructeur.

    Plus d'infos ici :

    http://msdn.microsoft.com/fr-fr/library/1t3y8s4s(VS.80).aspx

     

    mardi 20 mai 2008 09:47
  • Bonjour,

     

    Pour moi, la solution la plus propre serait celle-ci :

     

     

    public class Youcef

    {

    public Youcef ()

    {

    }

     

    public static Youcef CreateNew(int param) {

    if (param <= 0) {

    return null;

    }

     

    Youcef ret = new Youcef();

     

    // initialisation des propriétés.

    ...

    ...

     

    return ret;

    }

    }

     

    Séb

    mardi 20 mai 2008 09:53
  • Sinon tu as une astuce décrite ici:

    http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=975373&SiteID=1

    Basé sur le Pattern de la Factory, je recopie le code intéressant pour ceux qui veulent pas aller voir le lien

     

    Cela te permettra en effet de retourner le null que tu souhaites:

    Code Snippet

    public class Something
    {
         private Something(int someInput)
         {
              //Initialize object
         }

         public static void Create(int someInput)
         {
              if(someInput is not valid)
              {
                    return null;

              }
         
              return Something(someInput);

         }

    }

     

     

    Il y a quand même une petite note à lire précisant que cela ne marchera pas bien sur si cette classe Something sera une classe de base pour d'autres. Je pense néanmoins (à vérifier) qu'il y a un design pattern de factory qui réponds à ce problème.

     

    mardi 20 mai 2008 10:00
  • Bonjour,

    Merci pour votre réponse, c'est une bonne astuce mais je pense que le constructeur par défaut (sans argument) doit être privé sinon on peut initialiser des objets en utilisant le constructeur par défaut alors que les proprités de cet objet ne sont pas initialisé => risuque d'exception

     

    Merci bcp

    mardi 20 mai 2008 10:16
  • Bonjour,

    Merci pour votre réponse, c'est une bonne astuce

    mardi 20 mai 2008 10:22
  •  

    Sauf que le code de Radric ne compile pas : la méthode Create ne pas être "void"... Wink

     

    Bref, la méthode qu'il propose est exactement, celle que je donne plus haut.

     

    Séb

    mardi 20 mai 2008 12:50
  • Bonjour,

    c'est vrai, il faut changer le void

    bon remarque et merci bcp pour votre réponse

     

    mardi 20 mai 2008 13:12