int a, b, c;
Constructor()
{
a = 5;
b = 10;
c = 15;
//do stuff
}
Constructor(int x, int y)
{
a = x;
b = y;
c = 15;
//do stuff
}
Constructor(int x, int y, int z)
{
a = x;
b = y;
c = z;
//do stuff
}
Чтобы предотвратить дублирование «вещей» и нескольких присваиваний, я попробовал что-то вроде:
int a, b, c;
Constructor(): this(5, 10, 15)
{
}
Constructor(int x, int y): this(x, y, 15)
{
}
Constructor(int x, int y, int z)
{
a = x;
b = y;
c = z;
//do stuff
}
Это работает для того, что я хочу сделать, но иногда мне нужно использовать какой-то длинный код для создания новых объектов. или выполните некоторые вычисления:
int a, b, c;
Constructor(): this(new Something(new AnotherThing(param1, param2, param3),
10, 15).CollectionOfStuff.Count, new SomethingElse("some string", "another
string").GetValue(), (int)Math.Floor(533 / 39.384))
{
}
Constructor(int x, int y): this(x, y, (int)Math.Floor(533 / 39.384))
{
}
Constructor(int x, int y, int z)
{
a = x;
b = y;
c = z;
//do stuff
}
Этот код почти такой же, как и раньше, только передаваемые параметры не очень читабельны. Я бы предпочел сделать что-то вроде:
int a, b, c;
Constructor(): this(x, y, z) //compile error, variables do not exist in context
{
AnotherThing at = new AnotherThing(param1, param2, param3);
Something st = new Something(aThing, 10, 15)
SomethingElse ste = new SomethingElse("some string", "another string");
int x = thing.CollectionOfStuff.Count;
int y = ste.GetValue();
int z = (int)Math.Floor(533 / 39.384);
//In Java, I think you can call this(x, y, z) at this point.
this(x, y, z); //compile error, method name expected
}
Constructor(int x, int y): this(x, y, z) //compile error
{
int z = (int)Math.Floor(533 / 39.384);
}
Constructor(int x, int y, int z)
{
a = x;
b = y;
c = z;
//do stuff
}
По сути, я создаю параметры в теле конструктора. Затем я пытаюсь передать эти встроенные параметры другому конструктору. Кажется, я помню, как мог использовать ключевые слова «this» и «super» для вызова конструкторов, находясь внутри тела другого конструктора при кодировании на Java. В C# это не представляется возможным.
Есть ли способ сделать это легко? Я сделал что-то неправильно? Если это невозможно, должен ли я просто придерживаться нечитаемого кода?
Думаю, я всегда мог бы вырезать дублированный код в другой метод, полностью вне конструкторов. Тогда каждый конструктор будет просто делать свое дело и вызывать код, общий для других конструкторов.