Могу ли я вызвать в конструкторе и эту, и базовую перегрузки?

Ближайший поток, который я смог найти, был этот, но там сценарий другой - вызываемый базовый конструктор является конструктором по умолчанию. Здесь мне нужно указать, какой параметр я хочу передать.

Допустим, у нас есть следующий сценарий:

    public class Base
    {
        public string Str;

        public Base(string s)
        {
            Str = s;
        }
    }

    public class A : Base
    {
        public string Str2;

        public A(string str2)
            : base(str2)
        {
            Str2 = str2;
        }

        public A(string str2, string str)
            : base(str)
        {
            Str2 = str2;
        }
    }

Я хочу избежать повторения той же логики во второй перегрузке конструктора A (технически я мог бы обернуть всю логику в функцию, уменьшающую копирование-вставку / улучшающую ремонтопригодность, поскольку в конце все перегрузки будут полагаться на один и тот же код. Буду следовать этому, если другого решения нет).

Я думал, что могу вызвать сначала перегрузку 1-го конструктора A, а затем базовый. Но, похоже, не могу.

Какой здесь подход?


person Veverke    schedule 21.03.2016    source источник


Ответы (1)


Правильный подход был бы

public class A : Base
{
    public string Str2;

    public A(string str2)
        : this(str2, str2)
    {
    }

    public A(string str2, string str)
        : base(str)
    {
        Str2 = str2;
    }
}

Конструктор с одним параметром A вызывает конструктор с двумя параметрами A, передавая одну и ту же строку обоим параметрам, используя this( вместо base(. Затем вы удаляете тело конструктора с одним параметром, потому что вся работа выполняется в конструкторе с двумя параметрами.

person Scott Chamberlain    schedule 21.03.2016