2009-07-07 2 views

답변

14

베이스 클래스는 말이있다, 그러나 당신은 그것을 오버라이드 (override) "때마다"나는이 방법의 한 쌍 것이다하려면 : (사용

public void DoSomething() { 
    //things to do before 
    DoSomethingCore(); 
    //things to do after 
} 
protected abstract void DoSomethingCore(); 
+3

그러면 템플릿 메서드 패턴에 대한 언급을 던질 수도 있습니다. (그렇지 않으면 간단하게 촬영했을 수도 있습니다) –

+0

DoSomething 방법 이전의 "가상"키워드는 어떻습니까? – Kamarey

+1

@Kamarey DoSomething 메서드는 가상이 아닙니다. 하위 클래스가 덮어 쓰거나 구현할 것으로 예상되는 DoSomethingCore 메서드입니다. – ChrisW

1

당신은 virtual 방법을 찾고를 메서드를 재정의 (override) 할 수있는이 수식 자), 사용자는 그것을 강제적으로 덮어 쓸 수 없습니다. 어쨌든 시체를 가지고 있다면 이것을 강요하는 것이 좋습니다. 왜냐하면 처음에는 base를 호출 할 수 있기 때문입니다. 당신의 Method()와 다른 것은하지 않습니다. 처음에는 메소드를 오버라이드하지 않는 것과 같습니다.

public virtual YourMethod() { 
    // your base class code here 
} 

다음 다른 클래스에서 오버라이드 (override) 방법 :

public override YourMethod() { 
    // code to do before the base call 
    base.YourMethod(); 
    // code to do after the base call 
} 
3

당신의 기본 클래스는 방법 뭔가 않습니다,하지만 당신은 모든 서브 클래스 일부를 구현하기 위해 강제로 있는지 확인하려면 메서드의 일부인 경우 Marc Gravell의 답변에 설명 된대로 Template Method pattern이 필요합니다.

기본 클래스에 기본 구현을 제공하고 하위 클래스가 고유 한 구현을 제공하도록 할 수있는 방법이 없습니다. 그러나 추상 기본 클래스를 만들고 기본 구현을 제공하기 위해이를 상속 할 수는 있지만 해당 구체적인 클래스를 봉인 할 수는 있습니다.

public abstract class FooBase { 
    public abstract void DoStuff(); 
} 

public sealed class FooImpl : FooBase { 
    public override void DoStuff { 
     //default widget-munging code 
    } 
} 

지금 FooBase에서 상속하는 모든 클래스 DoStuff()를 구현해야하지만 서브 클래스가 상속 할 수있는 기본 구현 FooImpl 있습니다.

메서드 구현에 대한 책임을 해당 생성자의 기본 클래스에 전달되는 별도의 클래스로 위임하는 것이 좋습니다. 그 이름은 Strategy pattern입니다.

public sealed class Foo { 
    private IFooStrategy _strategy; 
    public Foo(IStrategy strategy) { 
     _strategy = strategy; 
    } 
    void DoStuff() { 
     _strategy.DoStuff(); 
    } 
    public static IFooStrategy DefaultStrategy { 
     //return singleton instance of the default strategy 
    } 
} 

지금 대신 푸 서브 클래스, 당신은 대신 IFooStrategy 인터페이스의 새로운 구현을 만들고, 푸 인스턴스에 사람들을 전달합니다. 그래서 당신은 하나가 할 수있는 :

new Foo(Foo.DefaultStrategy); 

또는

new Foo(new DifferentStrategy()); 
1

가 호출되지 않습니다 귀하의 기본 구현 같은데. 왜 아무도 접근 할 수없는 구현체를 제공하고 싶습니까? (내포물을 뛰어 넘지 않고 건너 뛰기)

관련 문제