模板方法模式提供了抽象基类有一个不可重写的方法:该方法实现了通用算法,不应该在子类中重写。在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#中)?
发布于 2012-08-15 17:50:44
sealed修饰符仅对重写基类成员的函数成员有效,以阻止它们成为派生类的虚拟成员。在C#中,函数成员在默认情况下是非虚拟的(与Java不同)。但是,您仍然需要类的sealed修饰符--类在默认情况下并不是密封的。
只需从您的方法中删除sealed修饰符就可以了。
有关密封方法的详细信息,请参阅C# 4规范的10.6.5节(密封属性和事件分别在10.7.5和10.8.4节中)。
当实例方法声明包含
sealed修饰符时,该方法被称为密封方法。如果实例方法声明包括sealed修饰符,则还必须包含override修饰符。使用sealed修饰符可以防止派生类进一步重写该方法。
发布于 2012-08-15 17:50:53
只需删除sealed关键字即可。默认情况下,方法是不可重写的;子类不能覆盖它们,只能隐藏它们。
发布于 2012-08-15 17:51:08
默认情况下,C#方法是密封的。
https://stackoverflow.com/questions/11974371
复制相似问题