【问题标题】:Inheritance with base class constructor with parameters [duplicate]带有参数的基类构造函数的继承[重复]
【发布时间】:2015-08-22 03:27:18
【问题描述】:

简单代码:

class foo
{
    private int a;
    private int b;

    public foo(int x, int y)
    {
        a = x;
        b = y;
    }
}

class bar : foo
{
    private int c;
    public bar(int a, int b) => c = a * b;
}

Visual Studio 抱怨 bar 构造函数:

错误 CS7036 没有给出与 foo.foo(int, int) 的所需形参 x 相对应的参数。

什么?

【问题讨论】:

    标签: c# inheritance constructor


    【解决方案1】:

    问题是基类foo没有无参数构造函数。所以你必须用派生类的构造函数的参数调用基类的构造函数:

    public bar(int a, int b) : base(a, b)
    {
        c = a * b;
    }
    

    【讨论】:

    • 为什么 C# 不让我继承双参数构造函数而不必重新声明它并引用基构造函数?
    • @Ant_222 你不能继承构造函数。你可以继承一个类,这个类应该是正确构造的,因此你需要调用它的构造函数。
    • 我知道这在 C# 中是不可能的,我在问为什么。既然继承的类接受了基类的方法,为什么它也不能接受构造函数呢?当我只需要基类的构造函数时,写public bar(int a, int b) : base(a, b) {} 毫无意义。
    【解决方案2】:

    我可能是错的,但我相信既然你是从 foo 继承的,你必须调用一个基本构造函数。由于您将 foo 构造函数显式定义为 require (int, int) 现在您需要将其向上传递。

    public bar(int a, int b) : base(a, b)
    {
         c = a * b;
    }
    

    这将首先初始化 foo 的变量,然后您可以在 bar 中使用它们。此外,为避免混淆,我建议不要将参数命名为与实例变量完全相同的名称。尝试使用 p_a 或其他东西,这样您就不会意外处理错误的变量。

    【讨论】:

      猜你喜欢
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2016-05-22
      • 2015-12-02
      • 1970-01-01
      • 2018-03-31
      • 2014-02-03
      相关资源
      最近更新 更多