2011-10-26 2 views
1

C#에서 할아버지의 생성자를 호출하는 방법이 있습니까?C#의 다중 레벨 상속 생성자

public class A 
{ 
    public A(parameterX x) 
    { 
     doSomething(); 
    } 
} 

public class B : A 
{ 
    public B(parameterX x) : base(x) 
    { 
     doSomethingElse(); 
    } 
} 

을 그리고 내가 가진 :의 내가 있다고 가정 해 봅시다 나는이 무엇 사용할 수

public class C : B 
{ 
} 

내가 A의 생성자를 호출하는 C의 생성자를 원하는?

public C(parameterX x) : base : base(x) 

또는 어떻게 그냥 C에서 A의 생성자를 호출 할 수 있습니다 : 같은 뭔가가 있나요?

감사합니다.

+0

왜 B 생성자가 A를 호출하지 않아도 C가 호출되면 A가 호출됩니다. –

답변

4

조부모 클래스의 생성자를 호출 할 수 없습니다.
그러나 기본 클래스가 이미 있으므로 둘 중 하나를 수행 할 필요가 없습니다.

public C(parameterX x) : base(x)으로 작성하면 B(x)이 호출되며, 이는 A(x)입니다.

일반적으로 기본 클래스의 생성자가 기본 생성자 (조부모)를 항상 호출하므로 조부모 생성자를 명시 적으로 호출 할 수 없으므로 조상 생성자가 두 번 생성되므로 결국이 생성자를 호출합니다.

+0

나도 알지만 문제는 내가 여기서 쓴 것보다 조금 더 복잡하다. B 생성자는 foo 클래스의 매개 변수를 취하고 C 생성자는 클래스 바의 매개 변수를 사용한다. 푸와 바는 다르지만 둘 다 클래스 D를 부모로가집니다. 그런 다음 클래스 A 생성자는 템플릿을 사용하기 때문에 둘 중 하나의 매개 변수를 사용합니다. 그래서 나는 B를 통과 할 수 없지만, A는 나의 매개 변수와 함께 잘 작동 할 것입니다. – lander16

+0

아니요. 항상 (직접) 기본 클래스 생성자를 호출해야합니다. 생성되지 않은 클래스는 가질 수 없습니다. 'protected' 생성자를'B'에 추가하는 것을 고려하십시오. 또한, 그것은 나쁜 디자인처럼 들립니다. 리팩토링을 고려하십시오. – SLaks

+0

보호 된 생성자를 추가 할 수 있습니다. 디자인이 최고가 아니며, 기존 환경에 통합 할 수있는 해킹 유형이 있습니다. 감사! – lander16

1

당신이하려고하는 것이 무엇인지 이해하지 못했지만 아마 더 나은 실제 디자인을 제안 할 수 있습니다. 아마도 Bar 매개 변수를 사용하는 B에 다른 생성자를 추가하여 필요한 것을 얻을 수 있습니다. A,하지만 C (bar)를 할 때 A (Bar) 생성자를 호출하면 아무것도하지 않습니다. base (bar)는 B로 이동 한 다음 A로 이동합니다.

+0

나는 이것을 할 수도있다. 나는 나쁜 디자인 인 것을 알고, 지금 당장은 많은 돈을 저축하려고 노력하고있다. – lander16

+0

나중에 더 많은 작업을 위해 스스로를 설정했을 수 있습니다. –