防止继承链中的虚拟和覆盖

Preventing the virtual and override in inheritance chain

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

假设我们有 Class A 和虚方法 GetBonus(int value)

接下来,我们从这个叫做 Class B 中导出一个 class。在这个 Class B 中,我们重写方法 GetBonus。

接下来,我们从Class B 中导出一个class,称为Class C。

现在class C 也可以覆盖class A 的GetBonus 方法

问题:

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

  2. 在Class C中,如何防止覆盖Class A的方法?

  3. 在Class C中,如何防止覆盖Class B的方法?

我知道有一个 SEALED 关键字用于密封虚拟重写方法。但以上问题将帮助我解决我的疑虑。

根据https://msdn.microsoft.com/en-us/library/ms173149%28v=vs.110%29.aspx(看图) 当您重写一个虚拟方法然后在另一个 class 中派生该 class 时,您继承了重写的实现

    class A
    {
        public virtual void GetBonus(int value)
        {
            //if you define this method as seald no one can override this
        }
    }

    class B:A
    {
        public override void GetBonus(int value)
        {

        }
    }

    class C:B
    {
        public override void GetBonus(int value)
        {
            //here we override implementation of class B
        }
    }
}

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

也许你问的有点含糊,但你只能防止在派生的classes中覆盖虚方法。不在派生 class 本身。最后,对于问题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.        
    {   }
}

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

此示例还回答了问题 1。它给出了编译错误,因为 class C 对 GetBonus 的覆盖试图覆盖 class B 提供的版本并且不是 A 提供的那个。这是真的,因为覆盖 A 中的那个显然有效,因为它不是 sealed.