2011-10-07 88 views
42

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

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

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

你不能没有构造函数创建一个类的对象。如果你不想无参数的话,可以创建一个接受一些参数的构造函数。 –

+0

我应该在OP中更加清楚,A类和A2类都有带参数的构造函数,我只是想删除无参数的构造函数,以便创建一个类的实例,您需要该类的所有必要参数工作。这似乎是一件很直观的事情,这是一个明智的做事方式吗? – sooprise

回答

78

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

我从来没有见过这个,但这正是诀窍。非常感谢! – sooprise

+0

原来,如果您将其他构造函数设置为使用带基本构造函数的参数,则可以忽略无参数构造函数。 I.E. A2中的第二个定义是唯一需要的。 – Tyeth

+0

@Tyeth真的!但是如果基类中没有无参数构造函数,每个构造函数都必须显式调用基类构造函数。如果没有指定基础构造函数,编译器将尝试在基类中查找无参数构造函数。 –

2

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

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

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

例子:

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

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

将基类放在第一位通常很容易阅读。 –

+1

将基类放在不同的文件中更为常见。 – Joe

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

您您的基类构造函数会自动调用。因此,当您创建派生类对象时,并且派生类对象没有带一个或多个参数的构造函数时,将不会传递给需要一个论据。 所以要做到这一点,你需要的东西传递给基类构造函数如下:

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

Class A2 : A{ 
    public A2():base(some parameter) 
} 
相关问题