2015-10-07 62 views
1

我试图在C#中实现模板方法模式。但我找不到一种方法来限制子类覆盖我的基类模板方法,除非我有两级深度继承来使用密封。如何限制在C#中重写父类方法的子类?

如果我省略虚拟,子类有提供新实现的自由,在这种情况下,它将从子类的引用被调用。相反,我需要一些机制,比如Java中的final,其中我可以限制模板方法在父类中重写。

+2

你的问题是混乱的。为什么你的基本方法甚至需要'虚拟'?如果它不是虚拟的,那么子类不能覆盖它 - 它可以提供一个名称与“new”相同的方法,但如果引用具有基类的类型,则永远不会调用此方法。如果它不是正确的类型,你可以简单地将它强制转换为基类来强制这个('((Parent)child).Foo()')。如果有人明确地调用'child.Foo()',他们知道他们正在这样做。 –

+0

无论你是虚拟的还是非虚拟的,你的子类都有能力提供新的实现。一个类不能限制其子类可以/应该做的事情。 – nawfal

回答

3

您的模板方法应该是非虚拟的(它在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 
    } 
} 
+0

感谢您的回复。 但是我有20个子类,OtherMethod的实现对其中的9个保持不变。所以我没有把它抽象化。有没有一种方法可以减少实现的数量。 –

+1

@RaviTiwari这9个孩子班级显然有一些共同点。为什么不添加其他级别的继承? – royhowie

+0

@RaviTiwari看起来你的课程太大,责任太多。尝试将它们重构为更小的类并使用合成来实现所需的功能。深层次的继承层次通常很难理解。 –

相关问题