2012-04-18 2 views
3

나는 MethodName()의 상속 된 클래스 오버라이드에서 base.MethodName()을 호출해야하는 많은 프레임 워크와 도우미 클래스를 보아 왔습니다. 그러나 일부는 오버라이드 된 메소드에서 마지막 호출이되도록 요구하는 반면, 다른 메소드는 첫 번째 호출을 요구합니다. 어느 방법으로 호출해야하는지는 항상 명확하지 않으며 일반적으로 문서 또는 샘플을 읽음으로써 만 알아낼 수 있습니다.기본 호출 순서 규칙을 재정의 하시겠습니까?

그래서 내가 그 지역에서 몇 가지 모범 사례가없고, 메소드 base에 대한 호출은 오버 라이드 된 메소드가 프레임 워크 디자이너에만 의존한다는 결론에 달렸습니까? 아니면 다른 디자인보다 디자인을 더 선호해야합니까? 개인적으로 나는 생성자 에서처럼 훨씬 더 자연스러운 것을 기본으로하는 것을 찾는다. (이 디자인이 시행된다.) 또는 개발자가 특정 호출 순서를 사용하도록하는 몇 가지 상황 (또는 영역)이 있습니까?

업데이트. @Attila의 도움을 받아 이제 대부분의 base 클래스 호출을 다시 디자인 할 수 있습니다. 대신이의 :

// FRAMEWORK 
public virtual void SomeMethod() 
{ 
    // framework code 
} 

// USAGE 
public override void SomeMethod() 
{ 
    base.SomeMethod(); 

    // user code 
} 

이 작업을 수행 :

// FRAMEWORK 
public void SomeMethod() 
{ 
    // framework code 

    // you can place UserSomeMethod where you want, 
    // you can change it position in new versions of a fremework 
    // without breaking user code 
    this.SomeMethodUserCode(); 
} 

protected abstract void SomeMethodUserCode(); 

// USAGE 
protected override void SomeMethodUserCode() 
{ 
    // user code 
} 

사용자는 유연성을 푼다 ("중단, 또는 잘못된 당신의 프레임 워크 작업을 할 적은 옵션이 있습니다"로 읽을 수 있습니다)하지만 사용법은 간단합니다.

답변

4

기본 메서드를 호출해야하는 정확한 위치와 순서는 완전히 기본 클래스의 논리 (작동 방식)에 따라 다릅니다. 따라서 항상 올바른 "편도"는 없습니다.

아마도 더 나은 디자인은 기본 호출을 다시 할 필요가 없다는 것입니다. 기본 메소드는 적합하다고 생각되는 방식으로 수행하고 deriverd 클래스는 추상 메소드를 통해 사용자 정의 기능을 제공 할 수 있습니다. 필요한 경우 기본 전화; 클라이언트가 호출의 정확한 순서를 알지 못하게합니다.

+0

기본 사항을 전혀 언급하지 않는 것이 좋습니다. 필수 우선 순위는 추상 IMHO 여야합니다. 우리는 requred'base.'를 가진 프레임 워크를 호출하면 나쁜 설계를 호출 할 수 있습니까? 그게 문제를 해결합니다! :-) –

+0

나는 그것이 상황에 달려 있다고 생각한다 : 일을하는 특정한 순서가 있지만 계산의 일부를 사용자 정의 할 수있는 경우 기본 호출 추상 메서드가 가장 좋은 방법이다. 계산이 하나의 특정 방법으로 설명 될 수없는 경우, 공통적이지만 고정 된 계산을 수행하도록 호출 기반 호출이 더 나은 방법입니다. – Attila

관련 문제