2008-09-04 106 views
12

我有一些課程奠定了這樣我可以防止繼承的虛擬方法在子類中被覆蓋嗎?

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 

回答

31

您可以單獨密封方法,以防止它們被重寫:

public sealed override void Render() 
{ 
    // Prepare the object for rendering   
    SpecialRender(); 
    // Do some cleanup  
} 
1

在B,做

protected override sealed void Render() { ... } 
0

肯定。如果你將一個方法標記爲Sealed,那麼它就不能在派生類中被覆蓋。

2

是的,你可以使用sealed關鍵字在B類的實現渲染的:

class B : A 
{ 
    public sealed override void Render() 
    { 
     // Prepare the object for rendering 
     SpecialRender(); 
     // Do some cleanup 
    } 

    protected virtual void SpecialRender() 
    { 
    } 
} 
1

嘗試sealed

class B : A 
{ 
    protected sealed override void SpecialRender() 
    { 
    // do stuff 
    } 
} 

class C : B 
    protected override void SpecialRender() 
    { 
    // not valid 
    } 
} 

當然,我認爲C可以是new繞過它。

0

的其他(?更好的)方式probablby使用new關鍵字以防止overiden特定的虛擬方法:

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 
    //{ 
    //} 
} 
+1

任何解釋這是爲什麼好?密封具有相當乾淨的含義。它說:「經過一番思考,我得出了這個決不應該被忽略的結論」。 – Ivan 2011-12-16 19:51:48

相關問題