2

TreeViewコントロールを使用してビジネスオブジェクトを表すアプリケーションに取り組んでいます。現在、ビジネスオブジェクトとTreeNodeの間のリンクは、TreeNodeのTagプロパティを介して維持されています。リンクが十分に「タイト」ではないと思うので、私はこれにあまり満足していません。たとえば、ビジネスオブジェクトのないTreeNodeオブジェクトが存在する可能性があります。また、ビジネスオブジェクトの状態に応じてTreeNodeイメージを更新したいと思います。したがって、TreeNodeから独自の特別なTreeNodeクラスを派生させました。

class ActionTreeNode : TreeNode
   {
      private Action mAction;

      public Action Action
      { get ... }

      public ActionTreeNode(Action action)
         : base()
      {
         if (action == null) throw new ArgumentNullException("action", "Paramter action must not be null.");

         mAction = action;
      }

    public void UpdateState()
      {
         switch (mAction.ActionState)
         {
            case ActionState.Passed:
               SelectedImageIndex = 3;
               ImageIndex = 3;
               break;
            case ActionState.Failed:
               SelectedImageIndex = 2;
               ImageIndex = 2;
               break;
            ...
         }

         return;
      }
   }

この最小限のアプローチでは、「(ActionTreeNode)myNode.Parent」のようにTreeNodeオブジェクトを返す基本クラスのプロパティまたはメソッドを呼び出すたびにキャストする必要があります。解決策は、すべてのメソッドまたはプロパティをオーバーライド/上書きし、ActionTreeNodeタイプのオブジェクトを返すことです。最小限のアプローチを取る方が適切だと思いますか、それともキャストを避けるためにすべてのメソッド、プロパティを再実装する努力をしますか?ありがとう。

4

2 に答える 2

3

私は最小限のアプローチが好きです。大量のキャストステートメントでコードが乱雑になることを心配している場合は、1つの場所でそれを実行するためのメソッドを作成するだけです。

private ActionTreeNode GetParent(ActionTreeNode node)
{
    return node.Parent as ActionTreeNode;
}

// in some method:
ActionTreeNode parent = GetParent(someNode);
if (parent != null)
{
    // the parent is an ActionTreeNode
}

ただし、親がActionTreeNodeでない場合は、戻り値のnullチェックを忘れないでください...

于 2009-05-05T09:49:20.397 に答える
2

問題は、強く型付けするためにどれくらいの時間をかけるかということだと思います。

あらゆるものを「タイト」にするためのコストと、作業するための堅固なプラットフォームを持っているあなたや他の開発者のコ​​ストを比較検討してください。

詳細を知らなくても、個人的には強く入力すると思います。これは、ツリーに格納されているさまざまなタイプなど、ビジネスロジックに変更を加えると、未知のバグではなくコンパイルエラーが発生することも意味するためです。

于 2009-05-05T09:58:26.303 に答える