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#中)?
该sealed改性剂是仅适用于功能部件被重写基类成员,以从被虚拟派生类的停止它们.默认情况下,函数成员在C#中是非虚拟的(与Java不同).你仍然需要sealed一个类的修饰符- 默认情况下,类不是密封的.
只需sealed从您的方法中删除修饰符,它应该没问题.
有关密封方法的更多详细信息,请参见C#4规范的第10.6.5节(密封属性和事件分别见10.7.5和10.8.4节).
当实例方法声明包含
sealed修饰符时,该方法被称为密封方法.如果实例方法声明包含sealed修饰符,则它还必须包含override修饰符.使用sealed修饰符可防止派生类进一步覆盖该方法.