在C#中,你需要调用基础构造函数吗?

在C#中,如果我有一个默认的构造函数的inheritance类,我必须显式调用基类的构造函数或将隐式调用?

class BaseClass { public BaseClass() { // ... some code } } class MyClass : BaseClass { public MyClass() // Do I need to put ": base()" here or is it implied? { // ... some code } } 

你不需要显式地调用基础构造函数,它将被隐式调用。

稍微扩展你的例子,创build一个控制台应用程序,你可以自己validation这个行为:

 using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { MyClass foo = new MyClass(); Console.ReadLine(); } } class BaseClass { public BaseClass() { Console.WriteLine("BaseClass constructor called."); } } class MyClass : BaseClass { public MyClass() { Console.WriteLine("MyClass constructor called."); } } } 

暗示,只要它是无参数的。 这是因为您需要实现具有值的构造函数 ,请参阅下面的代码以获取示例:

 public class SuperClassEmptyCtor { public SuperClassEmptyCtor() { // Default Ctor } } public class SubClassA : SuperClassEmptyCtor { // No Ctor's this is fine since we have // a default (empty ctor in the base) } public class SuperClassCtor { public SuperClassCtor(string value) { // Default Ctor } } public class SubClassB : SuperClassCtor { // This fails because we need to satisfy // the ctor for the base class. } public class SubClassC : SuperClassCtor { public SubClassC(string value) : base(value) { // make it easy and pipe the params // straight to the base! } } 

它暗示了基本无参数的构造函数,但它是当前类的默认值所需的:

 public class BaseClass { protected string X; public BaseClass() { this.X = "Foo"; } } public class MyClass : BaseClass { public MyClass() // no ref to base needed { // initialise stuff this.X = "bar"; } public MyClass(int param1, string param2) :this() // This is needed to hit the parameterless ..ctor { // this.X will be "bar" } public MyClass(string param1, int param2) // :base() // can be implied { // this.X will be "foo" } } 

这是隐含的。

派生类是build立在基类之上的。 如果你仔细想想,基本对象必须在内存中实例化,然后才能将派生类附加到它。 所以基础对象将在创build派生对象的方式上被创build。 所以不,你不要调用构造函数。

AFAIK,你只需要调用基础构造函数,如果你需要传递给它的任何值。

你不需要明确地调用基础构造函数,它将被隐式调用,但有时你需要传递参数给构造函数,在这种情况下,你可以这样做:

 using System; namespace StackOverflow.Examples { class Program { static void Main(string[] args) { NewClass foo = new NewClass("parameter1","parameter2"); Console.WriteLine(foo.GetUpperParameter()); Console.ReadKey(); } } interface IClass { string GetUpperParameter(); } class BaseClass : IClass { private string parameter; public BaseClass (string someParameter) { this.parameter = someParameter; } public string GetUpperParameter() { return this.parameter.ToUpper(); } } class NewClass : IClass { private BaseClass internalClass; private string newParameter; public NewClass (string someParameter, string newParameter) { this.internalClass = new BaseClass(someParameter); this.newParameter = newParameter; } public string GetUpperParameter() { return this.internalClass.GetUpperParameter() + this.newParameter.ToUpper(); } } } 

注意:如果有人知道更好的解决scheme,请告诉我。