C#

2012-08-15 10 views
5

템플릿 메서드 패턴의 템플릿 메서드 패턴을 구현하면 추상 기본 클래스가 재정의 할 수없는 메서드를 제공합니다.이 메서드는 공용 알고리즘을 구현하므로 하위 클래스에서 재정의되어서는 안됩니다. Java에서 템플릿 메서드는 추상 기본 클래스 내에서 final으로 선언됩니다. C#에서는 sealed 키워드가 비슷한 의미를 갖지만 재정의되지 않은 메서드는 sealed으로 선언 할 수 없습니다.C#

public abstract class Base 
{ 
    protected abstract AlgorithmStep1(); 

    protected abstract AlgorithmStep2(); 

    public sealed void TemplateMethod() // sealed: compile error 
    { 
     AlgorithmStep1(); 
     AlgorithmStep2(); 
    } 
} 

이 문제를 어떻게 해결할 수 있습니까? (C#의) 하위 클래스로 메서드를 재정의 할 수없는 이유는 무엇입니까?

+2

오버라이드 된 멤버 만 인감 할 수 있습니다. 키워드'abstract' 또는'virtual'가 없다는 것은 메소드가 이미 봉인되어 있음을 의미합니다. – ChaosPandion

답변

7

sealed 수정자는 기본 클래스 멤버를 재정의하는 함수 멤버에만 유효하며 파생 클래스의 가상 클래스가 아닌 것을 방지합니다. 함수 멤버는 기본적으로 C#에서는 가상이 아닙니다 (Java와 달리). 클래스에 대해 여전히 sealed 수정자가 필요합니다. 클래스는 기본적으로 봉인되어 있지 않습니다.

sealed 수정자를 메소드에서 제거하면됩니다.

봉인 된 메서드에 대한 자세한 내용은 C# 4 사양의 10.6.5 단원을 참조하십시오 (봉인 된 속성 및 이벤트는 각각 10.7.5 및 10.8.4 절에 있습니다).

인스턴스 메서드 선언에 sealed 수정자가 포함되어있는 경우 해당 메서드는 봉인 된 메서드라고합니다. 인스턴스 메서드 선언에 sealed 수정자가 포함되어 있으면 override 수정자가 포함되어야합니다. sealed 수정자를 사용하면 파생 클래스가이 메서드를 재정의 할 수 없습니다.

+0

좋아요, 그것은'sealed' 키워드를 제거함으로써 올바르게 작동하지만, 상속 된 method_를 숨길 수없는 메커니즘 (예 : Java의'final' 키워드)이 있다고 생각했습니다. 호기심에서이 메커니즘이 존재하지 않는 이유가 궁금합니다. – enzom83

+2

@ enzom83 : 아니요, 상속 된 메소드는 항상 숨길 수 있습니다 *하지만 숨길 수는 없으므로 정적 유형 인 Base의 표현식에서'TemplateMethod'를 호출하는 모든 사람은 항상 올바른 메소드를 호출합니다. –

1

sealed 키워드 만 제거하면됩니다. 기본적으로 메서드는 재정의 할 수 없습니다. 하위 클래스는이를 재정의 할 수 없으며 숨길 수 있습니다.

1

C# 메서드는 기본적으로 봉인됩니다.