Подтвердить что ты не робот

Наследование с помощью конструктора базового класса с параметрами

Простой код:

class foo
{
    private int a;
    private int b;

    public foo(int x, int y)
    {
        a = x;
        b = y;
    }
}

class bar : foo
{
    private int c;
    public bar(int a, int b)
    {
        c = a * b;
    }
}

Visual Studio жалуется на конструктор "bar":

Ошибка CS7036 Нет аргументов, которые соответствуют требуемому формальному параметру 'x' 'foo.foo(int, int)'.

Что??

4b9b3361

Ответ 1

Проблема заключается в том, что базовый класс foo не имеет конструктора без параметров. Поэтому вы должны вызвать конструктор базового класса с параметрами из конструктора производного класса:

public bar(int a, int b)
    : base(a, b)
{
    c = a * b;
}

Ответ 2

Я мог ошибаться, но я считаю, что, поскольку вы наследуете от foo, вам нужно вызвать базовый конструктор. Поскольку вы явно определили конструктор foo, требующий (int, int), теперь вам нужно передать это цепочку.

public bar(int a, int b) : base(a, b)
{
     c = a * b;
}

Сначала будут инициализированы переменные foo, а затем вы можете использовать их в баре. Кроме того, чтобы избежать путаницы, я бы рекомендовал не именовать параметры точно так же, как переменные экземпляра. Попробуйте p_a или что-то вместо этого, поэтому вы случайно не будете обрабатывать неправильную переменную.