2010-02-26 57 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 
    } 
} 

这是一个可怕的图案虽然,我不会推荐它,如果你能想出更好的方式来重新设计的对象/功能。