在C#中实现模板方法模式

时间:2012-08-15 17:47:37

标签: c# design-patterns template-method-pattern

模板方法模式规定抽象基类具有不可覆盖的方法:此方法实现通用算法,不应在子类中重写。在Java中,模板方法在抽象基类中声明为final,在C#中sealed关键字具有相似的含义,但不能重写未覆盖的方法sealed

public abstract class Base
{
    protected abstract AlgorithmStep1();

    protected abstract AlgorithmStep2();

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

我该如何解决这个问题? 为什么不能阻止子类覆盖一个方法(在C#中)?

3 个答案:

答案 0 :(得分:8)

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

只需从您的方法中移除sealed修饰符,它就可以了。

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

  

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

默认密封C#方法