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

4
请注意:这是一个概念性问题,与生产特定代码无关。
假设我们有一个名为A的类,其中包含一个虚方法GetBonus(int value)。
接下来,我们从中派生了一个称为B的类。在B类中,我们覆盖了方法GetBonus()。
然后,我们从B类派生了一个称为C的类。
现在,类C也可以覆盖类A的GetBonus方法。
问题:
1. 类C是否覆盖了类A或类B的方法定义? 2. 在类C中,如何防止覆盖类A的方法? 3. 在类C中,如何防止覆盖类B的方法?
我知道有一个SEALED关键字用于封闭虚拟覆盖方法,但以上问题将帮助我解决疑惑。

2
这是一个真正的问题.. 尤其是第2点和第3点是否可能? - helloworld
2
不要只是讲述你的代码,展示一下你所想到的类。 - CodeCaster
2个回答

6
问题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提供的版本而导致编译错误。这是因为覆盖来自A的版本显然会起作用,因为它没有被sealed


问题:由于B继承自A,C又继承自B,那么在正常情况下,是A的虚方法被C覆盖,还是B的被覆盖? - helloworld
@helloworld 这是一个纯理论问题,但正如我的示例所示,答案是后者。C 覆盖了 B 已经覆盖的方法。实际上,C 甚至不知道来自 A 的同名方法的存在。B 中的覆盖完全隐藏了这一点。希望这回答了你的问题 :) - pyrocumulus
所以除非在类B中重写的方法中使用了base关键字(如base.ClassAmethodname),否则类C将不会间接地覆盖Class A的方法,对吗? - helloworld
我想我可以用 true 来回答 :-) 或许这可以帮助:是的,B 可以使用 base 关键字来调用 A 版本的方法,但是 C 只与 B 的版本的该方法进行通信。至于这是否是间接覆盖,我认为由您来决定。 - pyrocumulus
1
谢谢你,我知道这是一个理论性的东西,我们对这个概念的想法似乎是一致的。谢谢。 - helloworld

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

据我所知,类C:B中的GetBonus方法覆盖了类A中的方法而不是类B中的方法!如果我错了,请您纠正我。 - helloworld
@helloworld 如果我没有误解,那个链接中的图片显示它继承了B类的实现,请看一下。 - Technovation

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接