我可以防止继承的虚拟方法在子类中被覆盖吗?
时间:2020-03-05 18:47:32 来源:igfitidea点击:
我有一些这样的课程
class A { public virtual void Render() { } } class B : A { public override void Render() { // Prepare the object for rendering SpecialRender(); // Do some cleanup } protected virtual void SpecialRender() { } } class C : B { protected override void SpecialRender() { // Do some cool stuff } }
是否可以在不破坏以下代码的情况下防止C类覆盖Render方法?
A obj = new C(); obj.Render(); // calls B.Render -> c.SpecialRender
解决方案
回答
我们可以密封单个方法以防止它们被覆盖:
public sealed override void Render() { // Prepare the object for rendering SpecialRender(); // Do some cleanup }
回答
在B中,
protected override sealed void Render() { ... }
回答
是的。如果将方法标记为"密封",则不能在派生类中覆盖该方法。
回答
是的,我们可以在B类的Render实现中使用sealed关键字:
class B : A { public sealed override void Render() { // Prepare the object for rendering SpecialRender(); // Do some cleanup } protected virtual void SpecialRender() { } }
回答
尝试"密封"
class B : A { protected sealed override void SpecialRender() { // do stuff } } class C : B protected override void SpecialRender() { // not valid } }
当然,我认为C可以通过成为new
来解决。
回答
另一种(更好的?)方法是通过使用new关键字来防止特定的虚拟方法被覆盖:
class A { public virtual void Render() { } } class B : A { public override void Render() { // Prepare the object for rendering SpecialRender(); // Do some cleanup } protected virtual void SpecialRender() { } } class B2 : B { public new void Render() { } } class C : B2 { protected override void SpecialRender() { } //public override void Render() // compiler error //{ //} }