c# - 继承和基础构造函数

标签 c# oop inheritance

所以我正在尝试自学编程,并且正在制作一个角色扮演游戏来练习。 (基本上只是一个非常简单的 C# 旧 rpg 战斗系统)但是,我对继承有点困惑。所以我有一个基类敌人:

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
{

}

为什么这么说

there is no argument given that corresponds to the required formal parameter '_name' of 'Enemy.Enemy(string, int , int, int)?

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

最佳答案

您问题的基本答案是。您的派生类必须定义一个构造函数,特别是当基类上没有可用的默认构造函数时,它们必须这样做。

这是因为基类构造函数总是在创建派生类时触发(事实上,它们是)。如果您没有构造函数来将其所需参数传递给基类构造函数,编译器将不知道如何处理。

在你的情况下,类似

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)
{
}

唯一的要求是使用现有的基类构造函数。

关于c# - 继承和基础构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44553428/

相关文章:

C++ protected 构造函数对派生类中的成员不可用

c# - Task.Run 是否会因 I/O 绑定(bind)操作产生开销?

c# - 为什么我的 List.Intersect 返回的结果与 Where(List.Contains) 返回的结果不同?

c# - 使用 NQUANT 进行图像量化时出现的错误

java - 序列化和普通对象存储的区别?

Javascript OOP - 从原型(prototype) setter 访问方法

java - 多个 'if' 语句和 'if-else-if' 语句对于互斥条件是否相同?

C++ 运算符重载和继承

c++ - 模板继承和抽象类

c# - 从 H2O 模型生成 C#