2012-08-15 70 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 2012-08-15 17:49:59

回答

7

sealed修饰符仅对覆盖基类成员的函数成员有效,以阻止它们对派生类虚拟化。在C#中,函数成员默认是非虚拟的(与Java不同)。您仍然需要sealed修饰符用于尽管 - 默认情况下,类不是密封的。

只需从您的方法中删除sealed修饰符,它应该没问题。

有关密封方法的更多详细信息(密封属性和事件分别在第10.7.5和10.8.4节),请参见C#4规范的第10.6.5节。

当实例方法声明包含sealed修饰符时,该方法被称为密封方法。如果实例方法声明包含sealed修饰符,则它还必须包含override修饰符。使用sealed修饰符可防止派生类进一步覆盖该方法。

+0

好吧,它通过删除'sealed'关键字正常工作,但我认为有一些机制(例如Java中的'final'关键字)_prevent您隐藏继承的method_。出于好奇,我想知道这种机制不存在的原因。 – enzom83 2012-08-15 19:11:35

+2

@ enzom83:不,你总是可以*隐藏*继承的方法 - 但是你不能覆盖它,所以任何在静态类型Base的表达式上调用'TemplateMethod'的人总是会调用正确的方法。 – 2012-08-15 19:15:32

1

只需删除sealed关键字。默认情况下,方法不可覆盖;子类不能覆盖它们,只能隐藏它们。

1

C#方法默认密封