Вызов базового конструктора и другого конструктора в конструкторе
Название может показаться запутанным.
Я хочу вызвать конструктор того же класса и конструктор базового класса внутри конструктора.
Возможно, моя первая попытка решить это может объяснить мой вопрос:
public MyClass(MyClass obj) : base(obj),this() {}
Но эта нотация не работает.
Есть ли решение решить эту проблему?
Ответы
Ответ 1
Нет, вы не можете сделать это по следующей причине:
Когда конструктор вызывает конструктор своей базы, последний вызов - ЧАСТЬ рассматриваемого конструктора. Таким образом, вы не можете вызвать другой конструктор того же класса И конструктор базового класса, потому что первый вызов уже содержит вызов базового конструктора - вы не можете инициализировать свою базу дважды
Ответ 2
С# позволяет использовать base (...) или this (...), потому что каждый конструктор должен в конечном итоге вызвать супер-конструктор. Поэтому, если бы можно было вызвать как base(), так и this(), произошли две суперконструкции-вызовы, которые были бы принципиально неправильными.
Это та же самая причина, по которой невозможно дважды вызвать базу (...).
Ответ 3
Нет технического решения для этого, вам нужно обходное решение, вывести логику из конструктора по умолчанию, сделать базовый вызов виртуальной функцией, чем переопределить ваш суперкласс.
Ответ 4
Один из способов - сделать конструктор без параметров MyClass
для вызова base(obj)
.
Но если вы не всегда хотите это сделать, я не думаю, что есть хороший способ.
Возможно, вы можете попытаться переместить вещи в этих конструкторах. Можете ли вы разместить дополнительную информацию о том, что на самом деле происходит в этих конструкторах?
Ответ 5
Вы можете просто скопировать код конструктора в данный конструктор. Или создайте специальную функцию setup(), которая вызывается из конструктора по умолчанию и этого конструктора.
Ответ 6
В С# вы также можете указать инициализацию по умолчанию в объявлении для каждого члена:
private int foo_ = 41;
Это решает для многих проблем с использованием других-конструкторов.
Ответ 7
Собственно, вы МОЖЕТЕ это сделать,
Вы можете запустить конструктор родительского класса из экземпляра дочернего класса, вот как вы это делаете:
public class Person
{
public Person(int age) {
this.Age = age;
}
public int Age;
}
public class students :Person
{
public students(string name, int age) :base(age )
{
this.studentName = name;
this.Age = age;
}
public string studentName;
}
Теперь, скажем, вы создаете объект из класса студентов,
Итак, вы сделаете это:
студенты std = новые студенты ( "Джек", 23);
Это отправит "Джек" в конструктор класса учеников, а 23 будет отправлен конструктору Person через: base (age)
Надеюсь, что эта помощь,
Приветствия.