【问题标题】:How to skip an immediate base class override function如何跳过直接基类覆盖函数
【发布时间】:2010-02-26 23:54:20
【问题描述】:

我有以下类结构,并且有很多类,如从 B 派生的 C,在一些我不想要的类中 B.OnShow() 但我希望 A.OnShow() 从 C Any 执行技巧?

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();
   }
}

【问题讨论】:

标签: c# oop


【解决方案1】:

不要让 C 从 B 扩展,而是创建一个从 A 扩展的新类“X”,并拥有 B 和 C 都需要的当前 B 中的部分,然后让 C 和 B 从“扩展” X”。然后 B 将只包含您专门为 B 想要的位(有点抽象,但我认为这是有道理的)。

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

【讨论】:

    【解决方案2】:

    Eric Lippert 已经回答了very similar question 并且基本上表示在 C# 中是不允许的。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-31
        • 2017-09-22
        相关资源
        最近更新 更多