鉴于这些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);
我的问题:我一直觉得我错过了一些明显的东西,我不需要明确检查类型。我有一个高级时刻吗?
答案 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
中,并将其覆盖在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做了什么,但它可以很好地工作。