質問

与えられた これらの 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 そして配置 HandleSysState そして両方でそれをオーバーライドします 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 が何をするかはわかりませんが、うまく機能する可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top