Вызов переопределенного конструктора и основного конструктора в C#

50
задан Cœur 16 January 2017 в 05:58
поделиться

7 ответов

Нет, это не возможно. Если Вы используете Отражатель для исследования IL, это сгенерировано для каждого конструктора, Вы будете видеть, почему - Вы закончили бы тем, что вызвали обоих из конструкторов для базового класса. В теории компилятор мог создать скрытые методы для выполнения то, что Вы хотите, но действительно нет никакого преимущества перед Вами делающий то же самое явно.

24
ответ дан Curt Hagenlocher 7 November 2019 в 11:01
поделиться

Я повторно объединил бы конструкторов в цепочку, таким образом, их называют как

Bar() : this(0) 
Bar(int) : Foo(int) initializes Bar
Foo(int) initializes Foo
Foo() : this(0) 

, Это подходит, если конструкторы без параметров принимают некоторое значение по умолчанию для международного параметра другого конструктора. Если конструкторы не связаны, Вы, вероятно, делая что-то не так с Вашим типом, или возможно нам нужно больше информации о том, что является Вами пытающийся достигнуть.

32
ответ дан Ilya Ryzhenkov 7 November 2019 в 11:01
поделиться

Это - только вещь, о которой я могу думать...

 public class Foo
{
    public Foo()
    {
    }
    public Foo(int? arg): this()
    {
    }

}
public class Bar : Foo
{
    private int x;
    public Bar(): this(new int?()) // edited to fix type ambiguity
    {
        // stuff that only runs for paramerless ctor
    }
    public Bar(int? arg)
        : base(arg)
    {
        if (arg.HasValue)
        {
            // Do stuff for both parameterless and parameterized ctor
        }
        // Do other stuff for only parameterized ctor
    }
}
4
ответ дан Charles Bretana 7 November 2019 в 11:01
поделиться

Я рекомендовал бы изменить Вашу цепочку конструктора для движения от наименее определенного до самого определенного.

class Foo
{
    Foo()
    {
      // do some stuff
    }

    Foo(int arg): this()
    {
      // do some other stuff
    }
}

class Bar : Foo
{
    Bar() : Bar(0)
    {
      // some third thing
    }

    Bar(int arg): base(arg)
    {
      // something
    }
}

Любое создание объекта Панели теперь вызовет все 4 конструкторов. Конструктор, объединяющий в цепочку, должен предоставить значения по умолчанию более определенным конструкторам, не наоборот. Необходимо действительно посмотреть на то, что Вы пытаетесь выполнить и удостовериться, что Вы делаете, имеет смысл. Curt прав, что существуют технические причины, Вы не можете сделать этого, но существуют также логические причины, почему Вы не были должны.

13
ответ дан NerdFury 7 November 2019 в 11:01
поделиться

Можно ли поместить материал от Панели () в Панели (интервал) и назвать ли Панель (интервал) с Панелью () со значением по умолчанию? Тогда Панель (интервал) может вызвать основного конструктора.

class Bar : Foo
{
    Bar() : this(0)
    {
    }

    Bar(int arg) : base(arg)
    {
    }
}

, Который точно не отвечает на Ваш вопрос, но в зависимости от Вашего сценария, могло бы быть осуществимое решение.

1
ответ дан g . 7 November 2019 в 11:01
поделиться

У разве Вас не может быть конструктора Панели, который берет интервал, вызывают конструктора без параметров?

1
ответ дан Jim Anderson 7 November 2019 в 11:01
поделиться

можно ли взять код инициализации для Панели () и сделать ли его методом и назвать ли его от обоих конструкторов и иметь ли нового конструктора, просто называют основу (аргумент)?

1
ответ дан CSharpAtl 7 November 2019 в 11:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: