如何跳过立即基类覆盖函数

时间:2010-02-26 23:54:20

标签: c# oop

我有以下的类结构,并且有很多像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();
   }
}

3 个答案:

答案 0 :(得分:5)

不要从B扩展C,而是创建一个从A扩展的新类“X”,并且具有B和C所需的当前部分,然后使C和B从“ X”。然后B将只具有你想要的B中的位(有点抽象,但我觉得这很有意义)。

一般来说,如果你试图跳过父方法,那么你做错了。

答案 1 :(得分:2)

Eric Lippert已经回复了very similar question,并且基本上声明C#中不允许这样做。

答案 2 :(得分: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
    }
}

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