2010-08-17 5 views
1

J'ai deux constructeurscomment créer une chaîne vide?

MyObj(String s){ //first constructor 
    ... 
    if(s==null) s = somecode; 
      this.s = s; 
    ... 
} 

MyObj(): this(null) { } //second constructor 

De cette façon, si le constructeur vide est appelé, il va rediriger vers le premier constructeur et la valeur initialise telle que déterminée par un code.

Cependant, maintenant j'ai un troisième constructeur

MyObj(Stream st){ //third constructor 
    ... 
} 

Maintenant, le second constructeur n'a aucune idée s'il est censé appeler le premier constructeur ou le troisième. Comment puis-je lui dire d'appeler le premier constructeur? J'ai essayé MyObj(): this(String s = null) et ça ne marche pas non plus.

Répondre

10

Peut-être: MyObj(): this((string) null) {}?

+0

hey, ça marche! Maintenant, je me sens embarassed que cette solution ne se produit pas me –

+0

heureux d'avoir pu aider :) – cdmckay

+0

Et c'est la même chose avec les appels de méthodes ordinaires, par exemple, si 'Surchargé (null)' est ambigu, alors 'Surchargé ((string) null); 'le résoudra. –

1

je trouve souvent plus facile de protéger ma santé mentale en utilisant une méthode d'initialisation pour les classes avec plusieurs constructeurs. Un seul

private void Init(string str, Stream stream, bool doOtherStuff) 
{ 
    // do stuff, replace nulls with defaults, etc 
} 

qui est appelé par tous les constructeurs, ce qui permet au constructeur lui-même de faire sa propre chose. Je n'aime vraiment pas les constructeurs qui appellent d'autres constructeurs parce que cela peut facilement créer de la confusion, et que quelque chose peut ne pas être initialisé ... ou quelque chose peut être initialisé plus d'une fois.

1

Je suis d'accord avec Siege. N'essayez pas d'enchaîner les constructeurs, utilisez plutôt une fonction Init qui peut être appelée de chaque ctor.

0

Ajout mon bit.

Je suggère également de remplacer plusieurs constructeurs avec des méthodes de createXXX statiques, et plutôt faire le constructeur privé.

Ce sera plus explicite à l'utilisateur de votre classe, dans laquelle l'utilisateur peut appeler la méthode create qu'il est intéressé et transmettre les paramètres pertinents uniquement. Et ne vous inquiétez pas de ce qu'il y a d'autre dans l'objet.

Questions connexes