如何在C#中限制子类重写父类方法?

如何在C#中限制子类重写父类方法?,c#,inheritance,C#,Inheritance,我试图在C#中实现模板方法模式。但我找不到一种方法来限制子类重写我的基类模板方法,除非我有一个两级深度继承要使用 如果我省略了virtual,子类可以自由地提供新的实现,在这种情况下,它将从子类的引用中调用。相反,我需要某种机制,比如Java中的final,在这种机制中我可以限制模板方法在父类中重写。您的模板方法应该是非虚拟的(在C#中是默认的)。它应该调用子类重写的受保护的虚拟/抽象方法 比如说 public abstract class Base { public void Temp

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


如果我省略了virtual,子类可以自由地提供新的实现,在这种情况下,它将从子类的引用中调用。相反,我需要某种机制,比如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
    }
}

你的问题令人困惑。为什么您的基本方法甚至需要是虚拟的?如果它不是虚拟的,子类就不能重写它——它可以提供一个同名的方法,标记为
new
,但是如果引用具有基类的类型,则永远不会调用此方法。如果它的类型不正确,您可以简单地将它强制转换为基类(
((父)子).Foo()
)。如果有人显式调用了
child.Foo()
,他们知道自己在这么做。无论您将其设置为虚拟还是非虚拟,您的子类都能够提供新的实现。类不能限制其子类可以/应该做什么。感谢您的回复。但我有20个子类,其中9个子类的OtherMethod实现保持不变。所以我没有把它抽象化。有没有办法减少实现的数量。@RaviTiwari这9个子类显然有一些共同点。为什么不添加另一个继承级别?@RaviTiwari看来您的类太大了,责任太多了。尝试将它们重构成更小的类,并使用组合来实现所需的功能。深层继承层次结构通常更难理解。