Вызов базового конструктора и другого конструктора в конструкторе

Название может показаться запутанным. Я хочу вызвать конструктор того же класса и конструктор базового класса внутри конструктора. Возможно, моя первая попытка решить это может объяснить мой вопрос:

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)

Надеюсь, что эта помощь, Приветствия.