请注意:这是一个概念性问题,与生产特定代码无关。
假设我们有A类虚拟方法GetBonus(int value)
接下来,我们从这个类B中派生出一个类。在这个B类中,我们重写方法GetBonus。
接下来,我们从B类派生一个名为Class C的类。
现在,C类也可以覆盖A类的GetBonus方法。
问题:
C类是否会覆盖A类或B类的方法定义?
在C类中,如何防止超越A类方法?
在C类中,如何防止超越B类方法?
我知道有一个SEALED关键字用于密封虚拟覆盖方法。但上述问题将有助于我澄清疑虑。
答案 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
}
}
}