2010-02-26 55 views
3

我有以下類結構,並有很多像C派生的類,在一些我不想通過B.OnShow()但我想A. OnShow()從C執行任何技巧?如何跳過一個直接的基類重寫函數

abstract class A 
{ 
    protected virtual void OnShow() 
    { 
     //some code 
     base.OnShow(); 
    } 
} 

class B : A 
{ 
    protected override void OnShow() 
    { 
     //some other code 
     base.OnShow(); 
    } 
} 

class C : B 
{ 
    protected override void OnShow() 
    { 
     //some other code 
     base.OnShow(); 
    } 
} 
+0

的可能重複的[如何調用二級基類方法象base.base.GetHashCode()](http://stackoverflow.com/questions/1006530/how-to-call-a-second-level鹼基級法狀基鹼基的GetHashCode) – nawfal 2014-05-02 16:09:48

回答

5

不要有C來自B伸出,而不是做出從A延伸並具有要用於B和C是當前B中的部分一類新的「X」,然後有C和B從延長「X」。然後,B將具體爲B所需要的位(有點抽象,但我認爲這是有道理的)。

一般來說,如果你試圖跳過一個父方法,那麼你做錯了什麼。

2

這聽起來像是一個設計問題。如果C真的是B,那麼它應該可以完成B在OnShow中需要做的一切。如果不是,那麼你應該利用除直接繼承以外的其他東西,或者使用一個虛擬函數調用以外的東西。

如果你真的想,你可以有:

abstract class A 
{ 
    protected virtual void OnShow() 
    { 
     UniqueOnShowStuff(); 
     base.OnShow(); 
    } 
    protected virtual void UniqueOnShowStuff() 
    { 
    // 
    } 
} 

class B : A 
{ 
    protected override void OnShow() 
    { 
     // Things all B's need to Show 
     base.OnShow(); 
    } 
    protected override void UniqueOnShowStuff() 
    { 
     // Things most B's might want to show but don't have to 
    } 
} 

class C : B 
{ 
    protected override void OnShow() 
    { 
     // Things all C's need to show 
     base.OnShow(); 
    } 
    protected override void UniqueOnShowStuff() 
    { 
     // override without a base call so you don't show B's things 
    } 
} 

這是一個可怕的圖案雖然,我不會推薦它,如果你能想出更好的方式來重新設計的對象/功能。