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

enz*_*m83 6 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 8

sealed改性剂是仅适用于功能部件被重写基类成员,以从被虚拟派生类的停止它们.默认情况下,函数成员在C#中是非虚拟的(与Java不同).你仍然需要sealed一个的修饰符- 默认情况下,类不是密封的.

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

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

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

  • @enzom83:不,你总是*隐藏*继承的方法 - 但是你不能覆盖它,所以任何在静态类型`Base`的表达式上调用`TemplateMethod`的人总是会调用正确的方法. (2认同)