防止继承链中的虚拟和覆盖
Preventing the virtual and override in inheritance chain
请注意:这是一个概念性问题,与生产特定代码无关。
假设我们有 Class A 和虚方法 GetBonus(int value)
接下来,我们从这个叫做 Class B 中导出一个 class。在这个 Class B 中,我们重写方法 GetBonus。
接下来,我们从Class B 中导出一个class,称为Class C。
现在class C 也可以覆盖class A 的GetBonus 方法
问题:
Class C 是否覆盖了 Class A 或 Class B 的方法定义?
在Class C中,如何防止覆盖Class A的方法?
在Class C中,如何防止覆盖Class B的方法?
我知道有一个 SEALED 关键字用于密封虚拟重写方法。但以上问题将帮助我解决我的疑虑。
根据https://msdn.microsoft.com/en-us/library/ms173149%28v=vs.110%29.aspx(看图)
当您重写一个虚拟方法然后在另一个 class 中派生该 class 时,您继承了重写的实现
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
确实是这里的答案。
也许你问的有点含糊,但你只能防止在派生的classes中覆盖虚方法。不在派生 class 本身。最后,对于问题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
在派生的 classes 中被覆盖。
此示例还回答了问题 1。它给出了编译错误,因为 class C 对 GetBonus
的覆盖试图覆盖 class B
提供的版本并且不是 A
提供的那个。这是真的,因为覆盖 A
中的那个显然有效,因为它不是 sealed
.
请注意:这是一个概念性问题,与生产特定代码无关。
假设我们有 Class A 和虚方法 GetBonus(int value)
接下来,我们从这个叫做 Class B 中导出一个 class。在这个 Class B 中,我们重写方法 GetBonus。
接下来,我们从Class B 中导出一个class,称为Class C。
现在class C 也可以覆盖class A 的GetBonus 方法
问题:
Class C 是否覆盖了 Class A 或 Class B 的方法定义?
在Class C中,如何防止覆盖Class A的方法?
在Class C中,如何防止覆盖Class B的方法?
我知道有一个 SEALED 关键字用于密封虚拟重写方法。但以上问题将帮助我解决我的疑虑。
根据https://msdn.microsoft.com/en-us/library/ms173149%28v=vs.110%29.aspx(看图) 当您重写一个虚拟方法然后在另一个 class 中派生该 class 时,您继承了重写的实现
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
确实是这里的答案。
也许你问的有点含糊,但你只能防止在派生的classes中覆盖虚方法。不在派生 class 本身。最后,对于问题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
在派生的 classes 中被覆盖。
此示例还回答了问题 1。它给出了编译错误,因为 class C 对 GetBonus
的覆盖试图覆盖 class B
提供的版本并且不是 A
提供的那个。这是真的,因为覆盖 A
中的那个显然有效,因为它不是 sealed
.