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

时间:2015-04-30 08:42:23

标签: c# inheritance polymorphism

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

假设我们有A类虚拟方法GetBonus(int value)

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

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

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

问题:

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

  2. 在C类中,如何防止超越A类方法?

  3. 在C类中,如何防止超越B类方法?

  4. 我知道有一个SEALED关键字用于密封虚拟覆盖方法。但上述问题将有助于我澄清疑虑。

2 个答案:

答案 0 :(得分:4)

问题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.        
    {   }
}

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

此示例还回答了问题1.它给出了编译错误,因为C类覆盖GetBonus试图覆盖类B提供的版本而不是A提供的版本。 {1}}。这是正确的,因为覆盖A中的那个显然会起作用,因为它不是sealed

答案 1 :(得分:2)

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

    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
        }
    }
}