覆盖密封有效,但为什么不在C#中进行虚拟密封?

时间:2015-02-04 06:50:55

标签: c# .net oop

以下代码段有效

public class BaseClass
{

   public virtual void Display()
   {
      Console.WriteLine("Virtual method");
   }
 }

public class DerivedClass : BaseClass
{

  public override sealed void Display()
  {
       Console.WriteLine("Sealed method");
  }

}

但为什么不呢

public class BaseClass
{

 public virtual sealed void Display()
 {
          Console.WriteLine("Virtual method");
 }
}

已修改

其实我正在阅读这篇文章What is sealed class and sealed method?。所以我按照作者的指示。突然,我试着用基类来演奏Sealed的概念。这就是我提出这个问题的原因。

3 个答案:

答案 0 :(得分:16)

override sealed是有效的,因为它说"我覆盖了基类方法,但派生类不能覆盖我。"那讲得通。其中一部分是谈论与基类的关系;另一个是谈论派生类的关系。

virtual sealed会说"你可以覆盖我(virtual)但你无法覆盖我(sealed)。"这是没有意义的。这两个修饰符是矛盾的适用于相同的关系。

答案 1 :(得分:4)

密封:

  

您还可以在方法或属性上使用sealed修饰符   覆盖基类中的虚方法或属性。这使得   您允许类从您的类派生并阻止它们   覆盖特定的虚拟方法或属性。

覆盖:

  

需要使用override修饰符来扩展或修改abstract或   虚拟实现的继承方法,属性,索引器或   事件

Sealed表示它是"层次结尾"对于给定的方法/类。制作方法virtual只是说"这是默认行为,覆盖我如果你想要不同的行为" 和{{1} }这意味着"这不能被覆盖" 是一个悖论。

答案 2 :(得分:1)

我不确定你甚至会怎么想。

sealed关键字表示您无法继承它。

  

您还可以在覆盖基类中的虚方法或属性的方法或属性上使用sealed修饰符。这使您可以允许类派生自类,并防止它们覆盖特定的虚拟方法或属性。

virtual关键字表示您可以。

  

virtual关键字用于修改方法,属性,索引器或事件声明,并允许在派生类中重写它。例如,任何继承它的类都可以覆盖此方法:

我不确定你为什么需要或想要两者。

将其应用于override时,这是有道理的。这意味着“您无法覆盖此行为”,并且有效地取代了方法或属性上的先前(相对于层次结构)virtual关键字。