Конструктор называет себя - PullRequest
4 голосов
/ 29 марта 2012

Недавно я обнаружил, что ни один конструктор аргументов и конструктор с несколькими аргументами не могут вызывать друг друга по очереди.Какова основная причина этого ограничения?Некоторые могут сказать, что конструкторы - это то место, где инициализируются ресурсы.Поэтому их нельзя называть рекурсивно.Я хочу знать, если это единственная причина или нет.Функции / методы / процедуры можно вызывать рекурсивно.Почему не конструкторы?

Ответы [ 5 ]

5 голосов
/ 29 марта 2012

Ответ заключается в том, что вызов другого конструктора является первой строкой любого конструктора, и, следовательно, ваше условие if для выхода из рекурсии никогда не будет выполнено и, следовательно, переполнение стека.

2 голосов
/ 29 марта 2012

Основная цель конструктора - инициализировать все глобальные переменные, описанные в определенном классе.

For Example: 

public class Addition(){

int value1;
int value2;

   public Addition(){           // default constructor
       a=10;
       b=10;
   }

  public Addition(int a, int b){
      this();                   // constructors having parameters , overloaded constructor
      value1=a;
      value2=b;
  }
}

public class Main(){
  public static void main(){
     Addition addition = new Addition(); //or
     Addition addition = new Addition(15,15);  
  }
}

Here, if you want to make instance of the class you can either make instance by calling default constructor or by calling constructor having parameters. So the constructors are overloaded and not overridden. If you want to call another constructor, that can only be done be putting either this() or super() in the first line of the constructor. But this is not prefferable.
1 голос
/ 29 марта 2012

На всех перечисленных вами языках объекты содержат конечный (и обычно короткий) набор свойств. Каждое свойство может содержать рекурсивную структуру (то есть список), но оно по-прежнему представлено одним свойством в объекте.

Я не вижу необходимости рекурсивно вызывать конструкторы. Это похоже на странную рекурсию использования для инициализации нескольких хорошо известных свойств.

Как вы сказали, вы можете вызывать конструкторы не рекурсивным способом для совместного использования кода на некоторых языках, которые вы упомянули.

C #: Использование конструкторов

public Employee(int weeklySalary, int numberOfWeeks)
    : this(weeklySalary * numberOfWeeks)
{
}
1 голос
/ 29 марта 2012

Ваше утверждение о том, что конструктор не может вызывать другие конструкторы, неверно для всех языков программирования. По крайней мере, я знаю, что Java может сделать это, в то время как C ++ не может. Но вы можете легко преодолеть это ограничение, написав приватную функцию __init и позволяя всем своим конструкторам вызывать ее.

1 голос
/ 29 марта 2012

Конструкторы не предназначены для явного вызова вне инициализации объекта, поскольку они ограничены в большинстве (я думаю, во всех) языках.Вместо этого вы можете создать дополнительную protected Init(...) функцию-член и вызывать ее внутри конструктора.

...