Как я могу использовать несколько конструкторов для удаления дублированного кода при сохранении читабельности?
<code>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 } </code>
Чтобы не допустить дублирования «материала» и нескольких заданий, я попробовал что-то вроде:
<code>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 } </code>
Это работает для того, что я хочу сделать, но иногда мне нужно использовать какой-то длинный код для создания новых объектов или сделать некоторые вычисления:
<code>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 } </code>
Этот код почти такой же, как и раньше, только передаваемые параметры не очень читабельны. Я бы предпочел сделать что-то вроде:
<code>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 } </code>
В основном я строю параметры в теле конструктора. Затем я пытаюсь передать эти встроенные параметры другому конструктору. Я думаю, что помню возможность использовать ключевые слова "this" и "super" для вызова конструкторов внутри тела другого конструктора при кодировании в Java. Это не представляется возможным в C #.
Есть ли способ сделать это легко? Я сделал что-то неправильно? Если это невозможно, я должен просто придерживаться нечитаемого кода?
Полагаю, я всегда мог вырезать дублированный код в другом методе полностью вне конструкторов. Тогда каждый конструктор будет делать свое дело и вызывать код, используемый другими конструкторам