2010-08-17 3 views
1

У меня есть два конструктораКак создать пустую строку?

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

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

Таким образом, если пустой конструктор вызывается, он будет перенаправлять на первый конструктор и инициализирует значение, как определяется некоторым кодом.

Однако, теперь у меня есть третий конструктор

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

Теперь второй конструктор не имеет представления о том, что, как предполагается, можно ли назвать первый конструктор или третий. Как мне сказать, чтобы вызвать первый конструктор? Я пробовал MyObj(): this(String s = null), и он тоже не работает.

ответ

10

Возможно: MyObj(): this((string) null) {}?

+0

эй, он работает! Теперь я чувствую смущение, что это решение мне не пришло –

+0

Рад, что я мог бы помочь :) – cdmckay

+0

И это то же самое с обычными вызовами методов, например, если «Перегруженный (нулевой);» является неоднозначным, то «Перегружен» ((строка) null); 'разрешит его. –

1

Мне часто легче защитить свое рассудительность, используя метод инициализации для классов с несколькими конструкторами. A

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

, вызываемый каждым конструктором, позволяющий самому конструктору выполнять свою собственную работу. Мне очень не нравятся конструкторы, вызывающие другие конструкторы, потому что они могут легко запутываться, и что-то не может быть инициализировано ... или что-то можно инициализировать несколько раз.

1

Согласен с Siege. Не пытайтесь подключать конструкторы, вместо этого используйте функцию Init, которая может быть вызвана по мере необходимости с каждого ctor.

0

Добавление моего бита.

Я бы также предложил заменить несколько конструкторов статическими методами CreateXXX и скорее сделать конструктор закрытым.

Это будет более явным для пользователя вашего класса, в котором пользователь может вызвать метод создания, который ему интересен, и передать только соответствующие параметры. И не беспокойтесь о том, что еще есть в объекте.

Смежные вопросы