C# 是否可以将重写的方法标记为final

C# 是否可以将重写的方法标记为final,c#,.net,inheritance,C#,.net,Inheritance,在C#中,是否可以将被重写的虚拟方法标记为final,以便实现者无法重写它?我该怎么做 举例说明可能更容易理解: class A { abstract void DoAction(); } class B : A { override void DoAction() { // Implements action in a way that it doesn't make // sense for children to override, e.g.

在C#中,是否可以将被重写的虚拟方法标记为final,以便实现者无法重写它?我该怎么做

举例说明可能更容易理解:

class A
{
   abstract void DoAction();
}
class B : A
{
   override void DoAction()
   {
       // Implements action in a way that it doesn't make
       // sense for children to override, e.g. by setting private state
       // later operations depend on  
   }
}
class C: B
{
   // This would be a bug
   override void DoAction() { }
}
有没有办法修改B以防止其他子C在编译时或运行时重写DoAction?

有,使用“sealed”:


您需要“sealed”。

您可以将该方法标记为
sealed


单个方法可以标记为sealed,这大致相当于在java中将方法标记为final。因此,在您的示例中,您会:

class B : A
{
  override sealed void DoAction()
  {
    // implementation
  }
}

您可以将单个方法密封起来,为什么要将类标记为密封的?您也可以在方法级别指定此修饰符…有趣的是,我从来都不知道您可以密封方法,但我从来没有理由这样做。
class A
{
   public virtual void F() { }
}
class B : A
{
   public sealed override void F() { }
}
class C : B
{
   public override void F() { } // Compilation error - 'C.F()': cannot override 
                                // inherited member 'B.F()' because it is sealed
}
class B : A
{
  override sealed void DoAction()
  {
    // implementation
  }
}