С# вызывает один конструктор из тела другого
Мне нужно вызвать один конструктор из тела другого, как это сделать?
В основном
class foo {
public foo (int x, int y)
{
}
public foo (string s)
{
// ... do something
// call another constructor
this (x, y); // doesn't work
foo (x, y); // neither
}
}
Ответы
Ответ 1
Вы не можете.
Вам нужно найти способ привязки конструкторов, например:
public foo (int x, int y) { }
public foo (string s) : this(XFromString(s), YFromString(s)) { ... }
или переместите код построения в общий способ настройки, например:
public foo (int x, int y) { Setup(x, y); }
public foo (string s)
{
// do stuff
int x = XFromString(s);
int y = YFromString(s);
Setup(x, y);
}
public void Setup(int x, int y) { ... }
Ответ 2
this(x, y)
прав, но это должно быть до начала тела конструктора:
public Foo(int x, int y)
{
...
}
public Foo(string s) : this(5, 10)
{
}
Обратите внимание, что:
- Вы можете только привязать к одному конструктору, либо
this
, либо base
- этот конструктор может, конечно, привязываться к другому.
- Вы не можете привязать конструктор после выполнения любого кода в теле конструктора.
- Вы не можете использовать
this
внутри аргументов для другого конструктора, включая методы вызова экземпляра, но вы можете вызвать статические методы.
- Все инициализаторы переменных экземпляра выполняются перед цепочным вызовом.
У меня есть немного больше информации в статье о цепочке конструктора.
Ответ 3
Чтобы вызвать конструктор base и this class явно, вам нужно использовать синтаксис, приведенный ниже (обратите внимание, что в С# вы не можете использовать его для инициализации полей, подобных на С++):
class foo
{
public foo (int x, int y)
{
}
public foo (string s) : this(5, 6)
{
// ... do something
}
}
//EDIT: Заметил, что вы использовали x, y в своем примере. Конечно, значения, заданные при вызове ctor таким образом, не могут опираться на параметры другого конструктора, они должны быть разрешены другим способом (они не обязательно должны быть константами, как в отредактированном примере кода выше). Если x
и y
вычисляются из s
, вы можете сделать это следующим образом:
public foo (string s) : this(GetX(s), GetY(s))
Ответ 4
Это не поддерживается - см. http://www.yoda.arachsys.com/csharp/constructors.html.
Однако вы можете реализовать общий (закрытый) метод, который вы вызываете из разных конструкторов...
Ответ 5
Я столкнулся с этой проблемой время или два сам... то, что мне пришлось сделать, это извлечь любую логику, которая мне нужна в этом другом конструкторе, в метод private void
и вызвать ее в обоих местах.
class foo
{
private void Initialize(int x, int y)
{
//... do stuff
}
public foo(int x, int y)
{
Initialize(x, y);
}
public foo(string s_
{
// ... do stuff
Initialize(x, y)
// ... more stuff
}
}