2013-07-24 1 views
3

는 가정이 두 클래스로 시작 :이것은 소프트웨어 디자인 패턴입니까?

public class Foo{ 
    public virtual Baz Bar(){ 
     return GetStandardBaz(); 
    } 
} 

public class Qux: Foo{ 
    public virtual Baz Bar(){ 
     return GetQuxBaz(); 
    } 
} 

지금 Bar가 호출 될 때 그것을 반환하기 전에 Baz에 뭔가를까지 요구가 온다 말할 수 있습니다. 나는 virtual protected 방법을 만들고, 그래서 같은 공공 방법에서 virtual을 제거하는 것입니다 :

public class Foo{ 
    public Baz Bar(){ 
     var value = BarInternal(); 
     DoSomethingFirst(value); 
     return value; 
    } 

    protected virtual Baz BarInternal(){ 
     return GetStandardBaz(); 
    } 
} 

public class Qux: Foo{ 
    protected override Baz BarInternal(){ 
     return GetQuxBaz(); 
    } 
} 

이렇게하면 그 때마다 Bar GET의라는 결과 Baz가 반환되기 전에 DoSomethingFirst로 전달됩니다. 예, 이것은 모든 하위 클래스의 주요 변경 사항이지만 어떤 호출 사이트도 업데이트 할 필요가 없습니다. Bar.

표준 디자인 패턴입니까? 제가 누락 된 더 좋은 방법이 있습니까? 또한 Internal보다 나은 수정 후 이름이 있는지 궁금합니다.

+1

Baz2 (또는 NewBaz 또는 기타) 메소드를 기본 클래스에 추가하지 않는 이유가 있습니까? 그렇게하면 부서지는 변화를 피할 수 있습니다. 명명 규칙에서 "내부"는 끔찍한 것이 아닙니다. "Impl"도 일반적입니다. – ThatBlairGuy

+2

'Qux'에서'override'를 의미합니까? – dtb

+0

내 질문에 대답 - Baz()를 호출하는 장소에 영향을주지 않는 요구 사항은 유효하지 않습니다. Baz()를 호출하는 파생 클래스의 메서드는 변경해야하며 상황 (예 : 라이브러리를 사용하는 다른 사람)에 따라 해당 코드에 액세스하지 못할 수도 있습니다. 새로운 행동으로 새로운 방법을 추가하는 것이 더 나은 방법입니다. – ThatBlairGuy

답변

2

Foo 클래스를 다음과 같이 약간 변경하면 Template Method pattern이됩니다.

public class Foo{ 
    public Baz Bar(){ 
     var value = BarInternal(); 
     DoSomethingFirst(value); 
     return value; 
    } 

    protected virtual Baz BarInternal(){ 
     return GetStandardBaz(); 
    } 
} 

Decorator pattern과 비슷한 것을 얻을 수 있습니다. 결정은 수업이 의도 한 바에 따라 달라집니다.

+0

위키 피 디아 페이지를 읽은 후에는 일반적으로 템플릿 패턴의 예제에 동의해야하지만 기본 클래스의 공용 메서드를 노출하고 가상 코어 메서드를 갖는 프로세스가 좀더 구체적으로 – Daryl

1

입력 및 출력을 표준 방식으로 필터링 할 수 있기 때문에 좋은 방법입니다. 유효성 검사와 추가 처리를 할 수 있습니다.

내부/가상 메서드가 특정 조건에 맞을 수 있도록 입력의 유효성을 검사 할 수도 있습니다.

일반적으로 접미사 "코어"(GetBarCore)를 사용합니다.

관련 문제