所以我正在努力教自己编程,我正在为练习制作一场RPG战斗。 (基本上只是c#中一个非常简单的旧RPG战斗系统)但是,我对继承有点困惑。所以我有一个基类Enemy:
class Enemy
{
public string name;
public int health;
public int attack;
public int level;
public Enemy(string _name, int _health, int _attack, int _level)
{
name = _name;
health = _health;
attack = _attack;
level = _level;
}
}
然后我有这个课程Dragon
:
class Dragon : Enemy
{
}
为什么这么说
没有任何论据符合所要求的形式 'Enemy.Enemy(string,int,int,int)的参数'_name'?
我的想法是它会使用敌人的构造函数,我必须让每个派生类都有自己的构造函数吗?
答案 0 :(得分:7)
您的问题的基本答案是是。派生类必须定义构造函数,特别是当基类上没有默认构造函数时,它们必须这样做。
这是因为在创建派生类时总会触发基类构造函数(实际上,它们是先触发 )。如果你没有构造函数来传递基类构造函数所需的参数,编译器就不知道如何处理它。
在你的情况下,像
public Dragon(string _name, int _health, int _attack, int _level)
:base(_name, _health, _attack, _level)
{
}
会让你开始。当然,您可能需要(并且可以拥有)Dragon
的其他参数。您还可以将文字传递给基础构造函数(因此您不需要使用所有基类参数来参数化Dragon
文字)。
public Dragon(string _name)
:base(_name, 1000, 500, 10)
{
}
唯一的要求是使用现有的基类构造函数。
答案 1 :(得分:3)
由于基类有一个构造函数,并且在创建派生类时它总是被触发,那么你应该向基类添加一个无参数的构造函数:
class Enemy
{
public string name;
public int health;
public int attack;
public int level;
public Enemy(string _name, int _health, int _attack, int _level)
{
name = _name;
health = _health;
attack = _attack;
level = _level;
}
protected Enemy()
{
}
}
或者在派生类中实现构造函数,如下所示:
public Dragon(string _name, int _health, int _attack, int _level)
: base(_name, _health, _attack, _level)
{
}
答案 2 :(得分:2)
是的,你必须在Dragon
中声明一个构造函数。您可以声明一个无参数的构造函数来调用基础构造函数:
public Dragon() : base("test", 1, 1, 1){}
或实现自己的参数化构造函数。
答案 3 :(得分:1)
我不确定我是否完全理解你的问题。 您想要创建类Dragon的实例并使用Enemy-Class的构造函数吗?
在这种情况下,您需要为Dragon-Class添加一个自己的构造函数,然后在那里添加' base'用于将参数从Dragon-Constructor转发到基类的构造函数的关键字。像这样:
class Dragon : Enemy
{
public Dragon(string _name, int _health, int _attack, int _level) : base (_name, _health, _attack, _level)
{
}
}
你甚至可以在你的龙的构造函数中添加一些额外的参数 - 你不必转发到基础构造函数中,如:
class Dragon : Enemy
{
public string DragonStuff { get; private set }
public Dragon(string _name, int _health, int _attack, int _level, string _dragonStuff) : base (_name, _health, _attack, _level)
{
DragonStuff = _dragonStuff;
}
}