代码之家  ›  专栏  ›  技术社区  ›  Jobi Joy

如何跳过立即基类重写函数

  •  3
  • Jobi Joy  · 技术社区  · 15 年前

    我有下面的类结构,有很多类,比如从B派生的C类,在一些我不希望由B.OnShow()执行的类中,但是我希望从C执行A.OnShow(),有什么技巧吗?

    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 回复  |  直到 14 年前
        1
  •  5
  •   TofuBeer    15 年前

    不要让c从b扩展,而是创建一个新的类“x”,它从a扩展,并且包含当前在b中的部分,您需要b和c,然后让c和b从“x”扩展。然后b将只包含你想要的b的特定位(有点抽象,但我认为这是有意义的)。

    一般来说,如果您试图跳过父方法,则说明您做了一些错误的事情。

        2
  •  2
  •   Community CDub    8 年前

    Eric Lippert 已经回答了 very similar question 基本上说在C中是不允许的。

        3
  •  2
  •   Tanzelax    15 年前

    这听起来像是一个设计问题。如果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
        }
    }
    

    不过,这是一个糟糕的模式,如果您能想出一种更好的方法来重新设计对象/功能的话,我建议您不要这样做。