代码之家  ›  专栏  ›  技术社区  ›  egrunin

作为返回值的派生类

  •  1
  • egrunin  · 技术社区  · 14 年前

    鉴于 我不能改变这些 ):

    public SysState GetSysState();
    
    public class SysState { /* nothing much here */}
    public class Normal : SysState { /* properties & methods */  }
    public class Foobar : SysState { /* different properties & methods */  }
    

    我的代码

    SysState result = GetSysState();
    
    if (result is Normal) HandleNormal((Normal) result);
    
    if (result is Foobar) HandleFoobar((Foobar) result);
    

    我的问题是: 我一直觉得我遗漏了一些明显的东西,我不需要显式地检查类型。我是不是要上大四了?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Merlyn Morgan-Graham    14 年前

    使用虚拟方法。将代码放在它们所操作的类中,而不是放在某些获得类引用的代码中。

    public class SysState {
      /* nothing much here, except...: */
      public abstract virtual void DoSomething();
    }
    
    public class Normal : SysState {
      /* properties & methods */
      public override void DoSomething()
      {
        // ...
      }
    }
    
    public class Foobar : SysState {
      /* different properties & methods */
      public override void DoSomething()
      {
        // ...
      }
    }
    
    SysState result = SomeFunctionThatReturnsObjectDerivedFromSysState();
    
    result.DoSomething();
    

    这将执行派生类的DoSomething方法。这被称为多态性,是最自然的(有些人会认为是唯一的) 对的 )继承的使用。

    请注意SysState.DoSomething 不必抽象,但它必须是虚拟的。

        2
  •  0
  •   ssube    14 年前

    handleX 和放置 Handle SysState 在这两种情况下 Normal Foobar 执行特定任务。它可能不是完美的解决方案,但看起来相对整洁。如果需要从其他来源输入数据,请将其作为参数传递?

    public class SysState
    {
        public bool Process(Information info)
        {
            return ( info.Good );
        }
    }
    
    public class Normal
    {
        public bool Process(Information info)
        {
            return doStuff();
        }
    }
    
    public class Foobar
    {
        public bool Process(Information info)
        {
            return diePainfully();
        }
    }
    

    显然,这只是一个例子,不知道HandleNormal和HandleFoobar做什么,但它可以很好地工作。