2013-04-03 3 views
1

Первоначально я получал ошибку, которую я не мог назвать «_coffee» в классе кофе «Кофе», потому что имена участников не могут быть такими же, как и их закрывающие типы. Когда я меняю имя на _coffee, я получаю сообщение об ошибке: «CoffeeShop не содержит конструктор, который принимает 0 аргументов». Я нашел решение онлайн, но они, похоже, не применимы или не работают правильно для моего приложения. Пожалуйста помоги.Ошибка: родительский класс не содержит конструктора, который принимает 0 аргументов

public class coffeeShop 
{ 
    string _size; 
    string _type; 
    public coffeeShop(string size, string type) 
    { 
     _size = size; 
     _type = type; 
       } 
    public override string ToString() 
    { 
     return String.Format("Thanks for ordering: {0}, {1}", _size, _type); 
    } 
} 
class Coffee : coffeeShop 
{ 
    string _size; 
    string _type; 
    string _caffiene; 
    public virtual void _Coffee(string size, string type, string caffiene) 
{ 
    _caffiene = caffiene; 
    _size = size; 
    _type = type; 
} 
    public override string ToString() 
    { 
     return String.Format("Product Information for: {0} {1} {3}", _size, _type, _caffiene); 
    } 
} 
+0

Напишите это: 'общественного кофе (размер строки, типа строки, строка caffiene) : основания (размер, типа) { _caffiene = caffiene; } ' –

+2

Следует, наверное, отметить, что эта иерархия наследования не имеет большого смысла. Кофе не кафе. –

+1

Ваша иерархия классов не имеет смысла. Вы должны использовать наследование для отношений «есть», но кофе - это не кофейня. Это отношение больше похоже на «имеет», то есть в кафе есть кофе. Вы представляете это, делая кофе полем/свойством в вашем классе CoffeeShop. – Polyfun

ответ

5

Компилятор C# испускает конструктор по умолчанию (без параметров), если конструктор не определен в вашем типе. Это то, что он пытается сделать для вашего класса Coffee (который по умолчанию ищет конструктор без параметров в базовом классе для вызова), однако ваш базовый класс (coffeeShop) имеет только конструктор, который принимает 2 аргумента.

Таким образом, любые подклассам нужны явно вызывать этот конструктор с помощью base ключевого слова:

public Coffee(string size, string type, string caffiene) : base(size, type) 
{ 
    _caffiene = caffiene; 
} 
2

Изменить

public virtual void _Coffee(string size, string type, string caffiene) 
{ 
    _caffiene = caffiene; 
    _size = size; 
    _type = type; 
} 

в

public Coffee(string size, string type, string caffiene) 
    : base(size, type) 
{ 
    _caffiene = caffiene; 
    _size = size; 
    _type = type; 
} 

или Альтернативно добавить

public coffeeShop() 
{ 
} 

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

Обратите внимание, что вы повторное объявление как размера и типа, было бы больше смысла, чтобы изменить конструктор

public Coffee(string size, string type, string caffiene) 
    : base(size, type) 
{ 
    _caffiene = caffiene; 
} 

удалить _size и _type из Coffee класса и объявить их как protected в базовом классе (coffeeShop)

+0

wow, вызов базового конструктора из виртуального метода подключен. – alex

+0

@alex, я не заметил, что это не был конструктор! обновленный –

Смежные вопросы