基类不包含无参数构造函数

本文关键字:构造函数 参数 包含无 基类 | 更新日期: 2023-09-27 18:10:37

我通过删除一些空构造函数来使构造函数更严格一些。我对继承非常陌生,并且对我得到的错误感到困惑:基类不包含无参数构造函数。我如何使A2从A继承而不存在一个空的构造函数A。此外,就我个人的理解,为什么A2需要一个空的构造函数A?

Class A{
    //No empty constructor for A
    //Blah blah blah...
}
Class A2 : A{
    //The error appears here
}

基类不包含无参数构造函数

在类A2中,需要确保所有构造函数都带参数调用基类构造函数。

否则,编译器将假定您希望使用无参数基类构造函数来构造A2对象所基于的A对象。

的例子:

class A
{
    public A(int x, int y)
    {
        // do something
    }
}
class A2 : A
{
    public A2() : base(1, 5)
    {
        // do something
    }
    public A2(int x, int y) : base(x, y)
    {
        // do something
    }
    // This would not compile:
    public A2(int x, int y)
    {
        // the compiler will look for a constructor A(), which doesn't exist
    }
}

示例:

class A2 : A
{
   A2() : base(0)
   {
   }
}
class A
{
    A(int something)
    {
        ...
    }
}

如果基类没有无参数构造函数,则需要使用base关键字从派生类调用一个:

class A
{
    public A(Foo bar)
    {
    }
}
class A2 : A
{
    public A2()
        : base(new Foo())
    {
    }
}

调用某个构造函数。默认是呼叫base()

还可以在调用base()时使用静态方法、文字和当前构造函数的任何参数。

  public static class MyStaticClass
    {
        public static int DoIntWork(string i)
        {
            //for example only
            return 0;
        }
    }
    public class A
    {
        public A(int i)
        {
        }
    }
    public class B : A
    {
        public B(string x) : base(MyStaticClass.DoIntWork(x))
        {
        }
    }

因为如果A没有默认构造函数,那么A2的构造函数需要使用A的构造函数的参数调用base()。参见这个问题:在c#中调用基构造函数

当您创建派生类的对象时,将自动调用基类构造函数。所以当你创建你的派生类对象时,你的派生类对象没有构造函数接受一个或多个参数,没有什么可以传递给想要一个参数的基类构造函数。因此,要做到这一点,需要向基类构造函数传递一些东西,如下所示:

Class A{
    //No empty constructor for A
    //Blah blah blah...
}
Class A2 : A{
    public A2():base(some parameter)
}