6

模板方法模式规定抽象基类有一个不可覆盖的方法:这个方法实现了通用算法,不应该在子类中被覆盖。在 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# 中)?

4

3 回答 3

8

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

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

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

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

于 2012-08-15T17:50:44.667 回答
1

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

于 2012-08-15T17:50:53.050 回答
1

C# 方法默认是密封的

于 2012-08-15T17:51:08.477 回答