防止继承链中的虚拟和替代

hel*_*rld 3 c# polymorphism inheritance

请注意:这是一个概念性问题,与特定于生产的代码无关。

假设我们有一个带有虚拟方法GetBonus(int value)的Class A

接下来,我们从该类派生一个类,称为类B。在该类B中,我们重写方法GetBonus。

接下来,我们从B类派生一个名为C类的类。

现在,类C也可以覆盖类A的GetBonus方法。

题:

  1. C类是否覆盖A类或B类的方法定义?

  2. 在C类中,如何防止A类方法的重载?

  3. 在C类中,如何防止B类方法被压倒?

我知道有一个SEALED关键字用于密封虚拟重写方法。但是上述问题将帮助我清除疑虑。

pyr*_*lus 5

问题2和3基本上可以归结为同一件事,而sealed这确实是答案。

也许您问的有点含糊,但是您只能防止在派生类中覆盖虚拟方法。不在派生类本身中。最后,对于问题2和3,您只有一个选择:

class A
{
    public virtual void GetBonus(int value) { }
}

class B : A
{
    public sealed override void GetBonus(int value) { } // We seal this method
}

class C : B
{
    public override void GetBonus(int value) // This line is invalid
      // because it cannot override the sealed member from class B.        
    {   }
}
Run Code Online (Sandbox Code Playgroud)

这将防止方法GetBonus在派生类中被覆盖。

此示例还回答了问题1。它给出了编译错误,因为类C的替代GetBonus试图覆盖类提供的版本,B而不是类提供的版本A。这是正确的,因为从中覆盖一个A显然是可行的,事实并非如此sealed