2008-08-20 4 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

OP가 "default (aka parameterless) 생성자"라고 명시했기 때문에 이것은 정확합니다. –

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() 옆에있는 귀하의 의견은 this()를 추가하면 호출이 기본 클래스를 인스턴스화하지 못하는 것처럼 오해의 소지가 있습니다. – Wrightboy

+0

@Wrightboy 예, 생성자가 호출되는 올바른 순서입니다. 내 요점은 묵시적이지 않다는 것이다. 명시 적으로'this()'또는'base()'를 지정할 수 있지만, 그렇지 않으면 둘 다 호출되지 않는다. – Keith

+0

'base()'가 항상 호출됩니다. 'public MyClass (int param1, string param2)'와'public MyClass (int param1, string param2) : base()'는 동일합니다. 'this()'는'base()'호출 다음에 추가 호출을 추가하기 만하면됩니다. – Wrightboy

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

참고 : 누군가가 더 나은 해결책을 알고 있다면 알려주세요.

+2

누군가가 구성과 상속의 교훈을 필요로하는 것처럼 보입니다. ;) –

관련 문제