C# 防止继承链中的虚拟和重写

C# 防止继承链中的虚拟和重写,c#,inheritance,polymorphism,C#,Inheritance,Polymorphism,请注意:这是一个概念性问题,与生产特定代码无关 假设我们有一个带有虚拟方法GetBonus(int值)的类 接下来,我们从类B派生一个类。在类B中,我们重写方法GetBonus 接下来,我们从类B派生一个称为类C的类 现在C类也可以重写A类的GetBonus方法 问题: 类C是重写类A的方法定义还是重写类B的方法定义 在类C中,如何防止重写类A的方法 在C类中,如何防止重写B类的方法 我知道有一个SEALED关键字用于密封虚拟重写方法。但以上问题将帮助我澄清我的疑问。根据(看图片) 当您重写一个

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

假设我们有一个带有虚拟方法GetBonus(int值)的类

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

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

现在C类也可以重写A类的GetBonus方法

问题:

  • 类C是重写类A的方法定义还是重写类B的方法定义

  • 在类C中,如何防止重写类A的方法

  • 在C类中,如何防止重写B类的方法

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

    根据(看图片) 当您重写一个虚拟方法,然后在另一个类中派生该类时,您将继承重写的实现

        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
    确实是这里的答案

    也许您的要求有点模糊,但您只能防止在派生类中重写虚拟方法。不在派生类本身中。最后,对于问题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
    中的一个显然会起作用,因为它不是
    密封的

    这是一个真正的查询。。Ess特别是第2点和第3点是否可能?与其讲述您的代码,不如展示您心目中的类。据我所知,类C:B中的方法GetBonus覆盖了类A中的方法,而不是类B中的方法!如果有错,请纠正我。@helloworld如果我没有误解的话,该链接中的图像显示它继承了类B的实现,请看一看。1问题:既然B派生自a,而C派生自B,那么在正常情况下,a的虚方法是否被C重写,或者B的重写方法是否被C重写?@helloworld这纯粹是一个理论问题,但正如我的示例所示,它是后者
    C
    覆盖已被覆盖的
    B
    方法。实际上,
    C
    甚至不知道
    A
    中是否存在相同的方法。
    B
    中的覆盖将
    C
    完全隐藏。我希望这能回答您的问题:)因此,除非在类B中被重写的方法中使用base关键字(如base.ClassAmethodname),否则类C不会间接重写类A方法,是吗?我想我可以用
    true
    :-)回答这个问题。也许这有帮助:是的
    B
    可以使用
    base
    关键字调用
    A
    的方法版本,但是
    C
    只能与
    B
    的方法版本进行通信。无论这是否是间接的压倒一切,我说这取决于你说。谢谢你,我知道这是一个理论问题,我们的想法似乎与这个概念一致。谢谢