Вопрос:

Ошибка C #: родитель не содержит конструктор, который принимает 0 аргументов

c# inheritance constructor compiler-errors

98199 просмотра

6 ответа

4700 Репутация автора

Мой код

public class Parent
{

    public Parent(int i)
    {
        Console.WriteLine("parent");
    }
}

public class Child : Parent
{
    public Child(int i)
    {
        Console.WriteLine("child");
    }

}

Я получаю ошибку:

Родитель не содержит конструктор, который принимает 0 аргументов.

Я понимаю, проблема в том, что Parentне имеет конструктора с 0 аргументами. Но мой вопрос: зачем нам конструктор с нулевыми аргументами? Почему код не работает без него?

Автор: Kuntady Nithesh Источник Размещён: 29.08.2011 01:10

Ответы (6)


18 плюса

145058 Репутация автора

Вам нужно изменить конструктор childкласса следующим образом:

public child(int i) : base(i)
{
    Console.WriteLine("child");
}

Часть : base(i)означает, что должен использоваться конструктор базового класса с одним intпараметром. Если это отсутствует, вы неявно указываете компилятору использовать конструктор по умолчанию без параметров. Поскольку в базовом классе такого конструктора не существует, он выдаст вам эту ошибку.

Автор: Daniel Hilgarth Размещён: 29.08.2011 01:13

202 плюса

43624 Репутация автора

Решение

Поскольку вы явно не вызываете родительский конструктор как часть вашего дочернего конструктора класса, существует неявный вызов вставленного родительского конструктора без параметров. Этот конструктор не существует, и вы получите эту ошибку.

Чтобы исправить ситуацию, вам нужно добавить явный вызов:

public Child(int i) : base(i)
{
    Console.WriteLine("child");
}

Или вы можете просто добавить родительский конструктор без параметров:

protected Parent() { } 
Автор: dlev Размещён: 29.08.2011 01:13

34 плюса

4310 Репутация автора

Вам нужно изменить конструктор вашего ребенка на:

public child(int i) : base(i)
{
    // etc...
}

Вы получили ошибку, потому что конструктор вашего родительского класса принимает параметр, но вы не передаете этот параметр от дочернего к родительскому.

Конструкторы не наследуются в C #, их нужно связывать вручную.

Автор: AndrewC Размещён: 29.08.2011 01:14

11 плюса

820289 Репутация автора

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

public class child : parent {
    public child(int i) : base(i) {
        Console.WriteLine("child");
    }
}
Автор: Hans Passant Размещён: 29.08.2011 01:14

0 плюса

8 Репутация автора

Вы можете использовать конструктор без параметров в вашем родительском классе:

public parent() { } 
Автор: Alin Размещён: 08.04.2015 08:53

0 плюса

690 Репутация автора

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

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

public child(int i) : base(i){
Console.WriteLine("child");}

Ссылка: конструктор вызывает иерархию во время наследования

Автор: NCA Размещён: 14.04.2015 06:29
Вопросы из категории :
32x32