我试图在C#中实现模板方法模式。但我找不到一种方法来限制子类覆盖我的基类模板方法,除非我有两级深度继承来使用密封。如何限制在C#中重写父类方法的子类?
如果我省略虚拟,子类有提供新实现的自由,在这种情况下,它将从子类的引用被调用。相反,我需要一些机制,比如Java中的final,其中我可以限制模板方法在父类中重写。
我试图在C#中实现模板方法模式。但我找不到一种方法来限制子类覆盖我的基类模板方法,除非我有两级深度继承来使用密封。如何限制在C#中重写父类方法的子类?
如果我省略虚拟,子类有提供新实现的自由,在这种情况下,它将从子类的引用被调用。相反,我需要一些机制,比如Java中的final,其中我可以限制模板方法在父类中重写。
您的模板方法应该是非虚拟的(它在C#中是默认的)。它应该调用子类覆盖的受保护的虚拟/抽象方法。
例如
public abstract class Base
{
public void TemplateMethod()
{
//do sth
OtherMethod();
//do sth more
}
protected abstract void OtherMethod();
}
public class Child : Base
{
protected override void OtherMethod()
{
//provide implementation
}
}
感谢您的回复。 但是我有20个子类,OtherMethod的实现对其中的9个保持不变。所以我没有把它抽象化。有没有一种方法可以减少实现的数量。 –
@RaviTiwari这9个孩子班级显然有一些共同点。为什么不添加其他级别的继承? – royhowie
@RaviTiwari看起来你的课程太大,责任太多。尝试将它们重构为更小的类并使用合成来实现所需的功能。深层次的继承层次通常很难理解。 –
你的问题是混乱的。为什么你的基本方法甚至需要'虚拟'?如果它不是虚拟的,那么子类不能覆盖它 - 它可以提供一个名称与“new”相同的方法,但如果引用具有基类的类型,则永远不会调用此方法。如果它不是正确的类型,你可以简单地将它强制转换为基类来强制这个('((Parent)child).Foo()')。如果有人明确地调用'child.Foo()',他们知道他们正在这样做。 –
无论你是虚拟的还是非虚拟的,你的子类都有能力提供新的实现。一个类不能限制其子类可以/应该做的事情。 – nawfal