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

标签 c# inheritance polymorphism

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

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

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

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

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

问题:

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

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

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

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

最佳答案

问题 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

关于c# - 防止继承链中的虚拟和覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29963002/

相关文章:

调用 Console.ReadLine() 的方法的 C# 单元测试

c# - 如何在软键盘Unity3d中检测 "done"按钮

language-agnostic - 为什么箭头在继承中上升?

c# - 伪多重继承

c++ - "class name"必须是以前定义的类或结构

function - 是否可以在不丢失 ocaml 中参数的多态类型的情况下设置函数的默认值

php - 在不触及核心的情况下修改 Opencart 中的 Controller ?

c# - 选择常量并与另一个列表并集

c++ - 当基类指针指向在基类中声明的派生类虚函数时,为什么会出现编译时错误?

c# - MVC5 Autofac : The view found at was not created