2008-08-20 11 views
44

В C#, если у меня есть унаследованный класс с конструктором по умолчанию, мне нужно явно вызвать конструктор базового класса или он будет неявным образом вызван?В C# вам нужно вызвать базовый конструктор?

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

ответ

49

Вам не нужно явно ссылаться на базовый конструктор, он будет неявно вызываться.

удлиняет ваш пример немного и создать консольное приложение, и вы можете проверить это поведение для себя:

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."); 
     } 
    } 
} 
0

AFAIK, вам нужно только вызвать базовый конструктор, если вам нужно передать любые значения.

6

Это подразумевается.

+0

Это правильно, потому что ОП заявляет «конструктор по умолчанию (без параметров)». – 2012-04-11 22:32:11

4

Производный класс строится на базовом классе. Если вы думаете об этом, базовый объект должен быть создан в памяти до того, как производный класс может быть добавлен к нему. Таким образом, базовый объект будет создан на пути к созданию производного объекта. Нет, вы не вызываете конструктор.

23

Это подразумевается при условии, что он без параметров. Это потому, что вы необходимо реализовать конструкторы, которые принимают значения см ниже код для примера:

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

Это подразумеваемой для базы без параметров конструкторов, но он необходим для дефолтов в текущем классе:

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" 
    } 
} 
+0

Немного стары, чтобы быть уверенным, но в случае, если кто-нибудь споткнутся об этом. Обратите внимание, что в вашем перегруженном конструкторе порядок вызова будет фактически: base() -> MyClass() -> MyClass (int param1, string param2). Ваш комментарий рядом с "this()" казался несколько вводящим в заблуждение, как если бы добавление этого() предотвратило бы вызов для создания базового класса. – Wrightboy 2015-07-09 19:22:12

+0

@Wrightboy да, это правильный порядок, в котором вызовутся конструкторы. Моя точка зрения заключалась в том, что это не подразумевается - вы можете явно указать `this()` или `base()`, но если вы этого не сделаете, то и вызовы не будут вызваны. – Keith 2015-07-12 07:48:14

-3

Вам не нужно вызывать базовый конструктор явно будет неявно называется, но иногда вам нужно передать параметры конструктору в этом случае вы можете сделать что-то вроде:

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(); 
     } 
    } 
} 

Примечание: Если кто-то знает лучшее решение, пожалуйста, сообщите мне.

 Смежные вопросы

  • Нет связанных вопросов^_^