我通过删除一些空构造函数使我的构造函数更严格一些。我对继承很新,并且对我得到的错误感到困惑:基类不包含无参数构造函数。如果没有A中的空构造函数,我怎么能从A继承A.另外,为了我个人的理解,为什么A2需要A的空构造函数?
Class A{
//No empty constructor for A
//Blah blah blah...
}
Class A2 : A{
//The error appears here
}
答案 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)
}