【问题标题】:Implementing the Template Method pattern in C#在 C# 中实现模板方法模式
【发布时间】:2012-08-15 17:47:36
【问题描述】:

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

【问题讨论】:

  • 您只能密封被覆盖的成员。缺少关键字abstract 或virtual 表示该方法已被密封。

标签: c# design-patterns template-method-pattern


【解决方案1】:

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

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

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

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

【讨论】:

  • 好的,通过删除sealed关键字它可以正常工作,但我认为有一些机制(例如Java中的final关键字)阻止你隐藏继承的方法。出于好奇,我想知道为什么不存在这种机制。
  • @enzom83:不,你总是可以隐藏继承的方法——但你不能覆盖它,所以任何人都调用TemplateMethod静态类型的表达式@987654332 @ 总是会调用正确的方法。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    C# 方法默认是密封的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多