2011-01-31 6 views
6

this() 및 base() 생성자를 지정하는 언어 구문이없는 것 같습니다. 이 (0) 전화 :C#의 this() 및 base() 생성자

public class Bar : Foo 
{ 
    public Bar() 
     :base(1) 
     //:this(0) 
    { } 
    public Bar(int schmalue) 
     :Foo(1) 
    { 
     //Gobs of initialization code 
     ... 
     Schmalue = schmalue; 
    } 

    public int Schmalue { get; private set; } 
} 

public class Foo 
{ 
    public Foo() 
    { 
     Value = 0; 
    } 

    public class Foo(int value) 
    { 
     Value = value; 
    } 

    public int Value { get; private set; } 
} 

컴파일러는 나에게 주석을 해제 할 때 '{'예상 없다는 오류를 제공합니다 : 다음 코드를 감안할 때. 이것은 내 코드를 개인적인 방법으로 분류 할 수 있기 때문에 귀찮은 일입니다.이 기능이 이러한 일을 막기 위해 분명하게 제공되었을 때입니다.

나는 이걸 잘못하고 있니? 필자는 구분 기호, 세미콜론, 쉼표를 사용하지 않았습니다 ... 이것은 개발팀의 감독이었던 것 같습니다. 나는 이것이 틀린 길로 가고 있거나 누군가가 대안에 대한 좋은 제안을 가지고 있다면 이것이 생략 된 이유에 관심이있다.

+1

[Calling Overriden Constructor 및 C#의 기본 생성자] 가능한 복제본 (http://stackoverflow.com/questions/335286/calling-overriden-constructor-and-base-constructor-in-c) – Oded

+2

감사합니다. 답. 본질적으로이 문제는 this()가 또 다른 기본 생성자를 호출 할 수 있다는 점입니다. – Sprague

답변

8

당신은 당신의 체인의 끝에 기본 생성자를 호출하여이 작업을 수행 할 수 있습니다 :

public Bar(): this(0) {} 
public Bar(int schmalue): base(1) { 
    // ... initialize 
} 
+0

감사합니다.이 답변입니다. 많은 사람들이 비슷한 일을 말한 후에 (좀 더 명확히 말하면) 분명히 그렇습니다. – Sprague

3

아니요, 단일 생성자 (동일한 클래스의 다른 생성자 또는 기본 생성자)에만 연결할 수 있습니다.

당신이하려는 일이 정말로 명확하지 않습니다. 일반적으로 파생 클래스에서 하나의 "기본"생성자를 만드는 것이 좋습니다. 파생 클래스 내의 다른 모든 생성자는 "기본"을 호출하여 기본 생성자를 호출하는 기본 호출을 "this"로 사용합니다.

그 모델이 모든 시나리오에 적합하지 않지만 - 특히 서로 다른 파생 된 생성자에서 다른 기본 생성자를 호출 할 때 - 그것은 일반적으로 좋은 모델입니다.

1

디자인에서 나는 BarFoo 클래스 사이에 많은 공통점을 볼 수 없습니다. 모든 것을 다시 구현할 때 FooBar에서 파생되는 이유는 무엇입니까? 두 클래스 모두 public getter 및 private setter가있는 정수 속성이 있으며 두 클래스 모두 기본 생성자와 정수 속성을 초기화 할 수있는 생성자가 있습니다. 그런데 왜 두 클래스가 존재합니까?

0

바의 두 번째 ctor에 단순히 잘못된 것입니다. 시도 :

public Bar(int schmalue) 
    :base(1) //would call Foo(1) 
{ 
    //Gobs of initialization code 
    ... 
    Schmalue = schmalue; 
} 

최초의 ctor의 댓글이 값 = 1

와 = 0

  • 전화 기반의 ctor의 푸 schmalue와

    • 초기화 바 같은 것을 의미하는 것

      오른쪽?

      는 그렇게 두 번째의 ctor를 교체하고 간단하게 처리 모두

      public Bar(int schmalue) 
          :this(1, schmalue) //would call Bar(1, schmalue) 
      { 
      } 
      
      private Bar(int value, int schmalue) 
      :base(value) 
      { 
          //Gobs of initialization code 
          ... 
          Schmalue = schmalue; 
      } 
      
  • 3

    당신이 하나의 생성자에서 생성자로 모두 thisbase를 호출 할 수 있다면 무슨 일이 일어날 지 생각해 값 수있는 또 다른 (개인)의 ctor를 추가합니다. 먼저 기본 생성자가 호출된다고 가정 해 봅시다. 그런 다음 this 생성자가 호출됩니다.이 생성자 자체는 기본 생성자를 호출합니다. 따라서 기본 클래스는 두 번 인스턴스화됩니다. 이것은 생성자의 의미를 깨뜨린다. 즉, 한 번 객체가 생성된다.

    이와 같이, basethis을 모두 호출하는 것은 금지되어 있습니다. 위임 된 this 생성자가 필요한 경우 특정 매개 변수로 기본을 호출하도록합니다.