派生类作为返回值

时间:2010-08-07 19:50:19

标签: c# derived-class

鉴于这些C#类(由WCF生成,我无法更改这些):

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 个答案:

答案 0 :(得分:1)

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

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不必是抽象的,因为它必须是虚拟的。

答案 1 :(得分:0)

您可以尝试合并handleX并将Handle放在SysState中,并将其覆盖在NormalFoobar中以执行特定任务。它可能不是完美的解决方案,但它看起来相对整洁。如果您需要从其他来源输入数据,请将它们作为参数传递?

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做了什么,但它可以很好地工作。