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

时间:2011-10-07 15:52:23

标签: c# constructor

我通过删除一些空构造函数使我的构造函数更严格一些。我对继承很新,并且对我得到的错误感到困惑:基类不包含无参数构造函数。如果没有A中的空构造函数,我怎么能从A继承A.另外,为了我个人的理解,为什么A2需要A的空构造函数?

Class A{
    //No empty constructor for A
    //Blah blah blah...
}

Class A2 : A{
    //The error appears here
}

6 个答案:

答案 0 :(得分:85)

在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
    }
}

答案 1 :(得分:8)

示例:

class A2 : A
{
   A2() : base(0)
   {
   }
}

class A
{
    A(int something)
    {
        ...
    }
}

答案 2 :(得分:2)

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

class A
{
    public A(Foo bar)
    {
    }
}

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

答案 3 :(得分:1)

来调用一些构造函数。默认设置是对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))
        {
        }
    }

答案 4 :(得分:0)

因为如果A没有默认构造函数,那么A2的构造函数需要使用A的构造函数的参数调用base()。请参阅此问题:Calling the base constructor in C#

答案 5 :(得分:0)

当您创建派生类的对象时,您的基类构造函数会自动被调用。因此,在您创建派生类对象时,并且派生类对象没有构造函数接受一个或多个参数时,将没有任何内容传递给需要一个参数的基类构造函数。 所以要做到这一点,你需要将一些东西传递给基类构造函数,如下所示:

Class A{
    //No empty constructor for A
    //Blah blah blah...
}

Class A2 : A{
    public A2():base(some parameter)
}