2009-08-26 2 views
2

기본 생성자를 호출하기 전에 먼저 파생 클래스 생성자를 호출해야하는 클래스가 있습니다. 나는 다음과 같은 코드에 의해 기본 생성자가 먼저 호출됩니다 알고생성자를 상속하여 생성자 호출 순서를 반대로합니다.

public class A { 

    protected A() { 
     //do something 
    } 

} 

public class B : A { 

    public B() : base() { 
     //do something else 
    } 

} 

순서, 또는에 대한 해결 방법을 반전 할 수있는 방법들이 있습니까? doConstructor()와 같은 기본 클래스에서 추가 보호 된 메서드를 만들고 가능한 첫 번째 작업 후에 파생 생성자에서 호출 할 수있는 가능한 솔루션 중 하나는 컴파일러에서 허용하지 않으므로 읽기 전용 필드를 사용할 수 없다는 것입니다.

답변

3

직접적인 방법은 없습니다. 과거에는 이러한 상황이 발생하여이를 해결하기 위해 Initialize 메서드를 사용했습니다.

public class A 
{ 
    protected A() 
    { 
     // Do pre-initialization here still. 

     Initialize(); 
    } 

    protected virtual Initialize() 
    { 
     // Do all post-derived-class initialization here. 
    } 
} 

public class B : A 
{ 
    public B() 
     : base() 
    { 
    } 

    protected override Initialize() 
    { 
     // Do initialization between pre- and post- initialization here. 

     base.Initialize(); 
    } 
} 

는만큼 당신이 여기에, 사전 포스트, 정상 초기화의 지침을 따르십시오, 그것은 합리적으로 안전하고 좋은 연습 내에서 될 수 있습니다.

+0

템플릿 메서드 패턴 – abhilash

+0

내 화면에서 코드를 읽은 것처럼 보입니다. o) 생성자의 가상 멤버를 호출하는 것이 좋습니다. –

+0

기본 생성자 ('A')에서 가상 메소드를 호출하는 것은 약간 위험합니다. 'B'의 오버라이드 (override)는, 현재,'B'의 constructor보다 전에 실행되고 있습니다. 이것은, 초기화되어 있지 않은 필드에 문제를 일으킬 가능성이 있습니다. 나는 일반적으로 여기 또는 더 나은주의를 권고한다 : ** post ** - ctor'Initialize' 단계. –

관련 문제