当前位置: 首页 > 知识库问答 >
问题:

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

汝承载
2023-03-14

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

public abstract class Base
{
    protected abstract AlgorithmStep1();

    protected abstract AlgorithmStep2();

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

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

共有3个答案

莫承运
2023-03-14

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

鲜于海
2023-03-14

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

伏德义
2023-03-14

sealed修饰符仅对重写基类成员的函数成员有效,以阻止它们对于派生类是虚拟的。函数成员在C#中默认为非虚拟的(与Java不同)。尽管如此,您仍然需要类的sealed修饰符-默认情况下,类不是密封的。

只需从方法中删除密封的修饰符,就可以了。

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

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

 类似资料:
  • 本文向大家介绍C++实现模板方法模式的示例代码,包括了C++实现模板方法模式的示例代码的使用技巧和注意事项,需要的朋友参考一下 模式定义 模板方法模式(Facade),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模式动机 当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不

  • 考虑一下问题: 我们有一个带有抽象方法的类。现在,我们希望强制此方法的每个覆盖都将执行一些参数检查或其他一些苦差事。我们希望此参数检查在所有覆盖中都相同。一种解决方案是将此行为包装在一个调用抽象方法的非抽象方法中: 我想让私有,这样的任何子类都不能在不检查其参数的情况下偶然调用它。不幸的是,这是不可能的: 错误:(9,5)Kotlin:修饰符“private”与“abstract”不兼容 Kotl

  • 我想创建两个带有模板方法(GOF)变体的HttpServlet。所以我创建了从HttpServlet扩展的抽象类: 两种混凝土等级: 在调用(成功)其中一个服务后,我无法得到任何响应。经过一些调试,Tomcat似乎在NIO通道和锁存器方面有一些问题: 2016-01-31 19:13:52 Http11NioProtocol[DEBUG]套接字:[org.apache.tomcat.util.ne

  • 本文向大家介绍C#模板方法模式(Template Method Pattern)实例教程,包括了C#模板方法模式(Template Method Pattern)实例教程的使用技巧和注意事项,需要的朋友参考一下 本文以一个简单的实例形式讲述了C#模板方法模式的实现方法,分享给大家供大家参考。具体实现方法如下: 这里假设要做一道红烧肉,做法有很多,在不同的做法中都有相同的部分,比如都要放油、放肉、放

  • 亦称: Template Method 意图 模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 问题 假如你正在开发一款分析公司文档的数据挖掘程序。 用户需要向程序输入各种格式 (PDF、 DOC 或 CSV) 的文档, 程序则会试图从这些文件中抽取有意义的数据, 并以统一的格式将其返回给用户。 该程序的首个版本仅支持 DOC 文

  • 一、定义 模板方法是基于继承的设计模式,可以很好的提高系统的扩展性。 java中的抽象父类、子类 模板方法有两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。 二、示例 Coffee or Tea (1) 把水煮沸 (2) 用沸水浸泡茶叶 (3) 把茶水倒进杯子 (4) 加柠檬 /* 抽象父类:饮料 */ var Beverage = function(){}; // (1) 把水煮沸