继承和基础构造函数

时间:2017-06-14 19:43:40

标签: c# oop inheritance

所以我正在努力教自己编程,我正在为练习制作一场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'?

我的想法是它会使用敌人的构造函数,我必须让每个派生类都有自己的构造函数吗?

4 个答案:

答案 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;
    }
}