首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中实现模板方法模式

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

Stack Overflow用户
提问于 2012-08-15 17:47:36
回答 3查看 1.1K关注 0票数 6

模板方法模式提供了抽象基类有一个不可重写的方法:该方法实现了通用算法,不应该在子类中重写。在Java中,模板方法在抽象基类中声明为final,在C#中,sealed关键字具有类似的含义,但未重写的方法不能声明为sealed

代码语言:javascript
复制
public abstract class Base
{
    protected abstract AlgorithmStep1();

    protected abstract AlgorithmStep2();

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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修饰符可以防止派生类进一步重写该方法。

票数 8
EN

Stack Overflow用户

发布于 2012-08-15 17:50:53

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

票数 1
EN

Stack Overflow用户

发布于 2012-08-15 17:51:08

默认情况下,C#方法是密封的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11974371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档