2016-12-09 6 views
0

У меня есть базовый класс:C# Ошибка из производного класса

public class Base { 
    public string Foo { get; set; } 
    public float Bar { get; set; } 
    public float Foobar { get; set; } 

    public Base (string foo, float bar, float foobar) { 
     Foo = foo; 
     Bar = bar; 
     Foobar = foobar; 
    } 
} 

я получаю сообщение об ошибке при попытке добавить класс, который расширяет это:

public class Derived : Base { 
    public Base derived = new Derived ("Foo", 0f, 0f); 
} 

ошибка ПОЛУЧАЛ гласит следующее: Base does not contain a constructor that takes 0 arguments

Я получаю эту ошибку в строке 1 класса Derived. Любые исправления/причины, почему это происходит?

+3

Конструкторы не наследуются. Объявите конструктор в 'Derived', который принимает те же аргументы и вызывает базовый конструктор, используя синтаксис' public Derived (...): base (...) '. –

ответ

8

Без определения конструктора в производном классе по умолчанию является безпараметрический конструктор. Какой базовый класс не имеет, поэтому производный класс не имеет возможности создавать свой базовый класс (и, следовательно, сам).

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

public Derived(string foo, float bar, float foobar) : base(foo, bar, foobar) { } 

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

public Derived() : base("foo", 1.0, 2.0) { } 

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


Примечание: Это означает, что вы, вероятно, это не нужно вообще:

public Base derived = new Derived ("Foo", 0f, 0f); 

Похоже, вы пытаетесь создать экземпляр Base как члена из Derived , Но Derivedявляется экземпляром Base. Если вы хотите использовать Base как пример, как, что тогда вы не хотите использовать наследование:

public class Derived { // not inheriting from Base 
    public Base base = new Base ("Foo", 0f, 0f); 
} 

Конечно, в этой точке «базы» и «производном» будет вводить в заблуждение названия, так как эти классы Wouldn Фактически, в структуре наследования.

4

Поскольку конструктор класса Base принимает три параметра, необходимо передать значения для этих параметров из конструктора класса Derived:

public Derived(string foo, float bar, float foobar): base(foo, bar, foobar) {} 
0

попробовать это:

public class Derived : Base 
{ 
    public Derived() 
     : base("Foo", 0f, 0f) 
    { 

    } 

    public Base derived = new Derived(); 
} 

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

public Base derived = new Derived() { Foo = "Foo", Bar = 0f, Foobar = 0f }; 
Смежные вопросы