2012-03-08 5 views
2

공통된 기능 세트를 공유하는 비슷한 (그러나 약간 다른) 클래스로 수행 할 수있는 많은 작업이 있습니다.추상 클래스 또는 부분?

내 의도는 상위 클래스에이 기능을 추출하는 것이며,이 자체를 구현하지 않으려 고하기 때문에 abstract으로 표시했습니다.

그러나 모든 호출 클래스는 추출 된 공통 기능을 포함하는 단일 메서드를 호출합니다. 나는 override 부모 클래스 메서드를 싶지 않지만 그 자식 클래스에 정의 된대로 이외에 을 실행하려고합니다.

처음에는 이것이 부분적인 방법에 대한 작업이라고 생각했지만, 다소 의미를 깨뜨릴 수 있다고 생각합니다. 그래서 나에게 가장 좋은 방법은 무엇입니까? 여기 터널 비전을 조금 경험해보십시오.

+0

죄송합니다, 이걸 조금 분명히 해줄 수 있겠 어? " 부모 클래스 메소드를 ovveride하고 싶지 않지만 자식 클래스에 정의 된 것 이외에 실행되도록하고 싶습니다. " 하위 클래스에서 정의한 기능은 어디에 있습니까? – Paddy

답변

6

당신은 이런 식으로 그것을 할 수 :

public abstract class Parent 
{ 
    public void TheSingleMethod() 
    { 
     CommonFunctionality(); 

     InternalDo(); 
    } 

    protected abstract void InternalDo(); 

    private void CommonFunctionality() 
    { 
     // Common functionality goes here. 
    } 
} 

public class Derived : Parent 
{ 
    protected override void InternalDo() 
    { 
     // Additional code of child goes here. 
    } 
} 
+0

오버 라이딩 된 메소드에서 base.InternalDo()를 호출하지 않는 이유는 무엇입니까? –

+0

그 이유는이를 시행 할 수 없기 때문입니다. 파생 된 모든 클래스에 대해 공통 기능이 실행되도록 * 적용하는 방법을 보여 주면됩니다. * 선택 사항 * 인 경우 제안이 진행 방법입니다. –

+0

아, 지금 그의 필요가 더 잘 이해하고 있습니다. 좋은 지적! –

0

소리와 같은 구성 및 Decorator pattern 당신을위한 또 다른 옵션이 될 수 있습니다.

1

는 소리 당신이 필요로 같은 Template method

예를

abstract class BaseClass { 
    public void Common Method() { 
     // Common tasks 

     // Call template method 
     this.SubclassSpecificMethod(); 

     // Can also do more code after the call to the template method 
    } 

    protected abstract void SubclassSpecificMethod(); 
} 
0

를 들어 당신이 또한 수행 할 수 있습니다

abstract class BaseClass 
{ 
    public void Method() { 
     // Common tasks 
    } 
} 

class RealClass : BaseClass 
{ 
    public void Method() { 
     base.Method(); 
     // custom tasks for this class 
    } 
} 
+0

이 메서드는 모든 자식에 대해 공통 기능이 실행되도록 강제하지 않습니다. 좀 더 자세한 정보는 [내 대답에 대한 의견] (http://stackoverflow.com/questions/9615909/abstract-classes-or-partial/9615974#comment12201179_9615974)을 참조하십시오. –

+0

나는 알고있다. 그러나 저자는 그것을 요구하지 않았다. 내 방법은 더 많은 유연성을 제공합니다. 저자의 필요에 따라 하나 또는 다른 방법이 있습니다. – Deadeye

+0

예, 그는 요청했습니다. "부모 클래스 메서드를 재정의하고 싶지 않지만 자식 클래스에 정의 된 것 이외에 실행하려고합니다." –

관련 문제