質問
与えられた これらの 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);
私の質問: 型を明示的にチェックする必要はないという、明らかな何かが欠けていると感じ続けています。私はシニアの瞬間を過ごしていますか?
解決
仮想メソッドを使用します。コードは、クラスへの参照を取得するコードではなく、動作するクラスに配置してください。
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 は抽象的である必要はありませんが、仮想的である必要があることに注意してください。
他のヒント
組み合わせてみてもいいかもしれません 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 が何をするかはわかりませんが、うまく機能する可能性があります。
所属していません StackOverflow