C# 防止继承链中的虚拟和重写
请注意:这是一个概念性问题,与生产特定代码无关 假设我们有一个带有虚拟方法GetBonus(int值)的类 接下来,我们从类B派生一个类。在类B中,我们重写方法GetBonus 接下来,我们从类B派生一个称为类C的类 现在C类也可以重写A类的GetBonus方法 问题: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关键字用于密封虚拟重写方法。但以上问题将帮助我澄清我的疑问。根据(看图片) 当您重写一个
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
的方法版本进行通信。无论这是否是间接的压倒一切,我说这取决于你说。谢谢你,我知道这是一个理论问题,我们的想法似乎与这个概念一致。谢谢