2009-05-05 7 views
2

私はいくつかのアプリケーションで、TreeViewコントロールを使用してビジネスオブジェクトを表現しています。現在、ビジネスオブジェクトとTreeNode間のリンクは、TreeNodeのTagプロパティによって維持されます。私はリンクが "タイト"ではないと思うので、これにはあまり喜んでいません。たとえば、ビジネスオブジェクトを持たないTreeNodeオブジェクトが存在する可能性があります。ビジネスオブジェクトの状態に応じてTreeNodeイメージを更新することもできます。したがって、私はツリーノードからの私自身の特別なのTreeNodeクラス派生:私は「のようにTreeNodeオブジェクトを返し、基本クラスのプロパティやメソッドを呼び出すたびにキャストする必要があり、この最小限のアプローチで基本クラスのメソッド、プロパティ、...をどれだけ優先させるか。 .net 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 。親"。解決策は、すべてのメソッドまたはプロパティを上書きまたは上書きし、ActionTreeNode型のオブジェクトを返すことです。 キャストを避けるために、最小限のアプローチをとる方が適していると思いますか、すべてのメソッド、プロパティを再実装しようと努力しますか?ありがとう。

答えて

3

私は最小限のアプローチが好きです。あなたはキャスト文の負荷であなたのコードを乱雑に心配している場合は、単に一つの場所にあなたのためにそれを行うためのメソッドを作成します。

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 
} 

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

+0

私はこのバージョンも好きです。たぶん、パラメータとしての文字列を持つActionTreeNode ctorも同様にオーバーライドする必要があります。 – crauscher

2

強く型付けするために努力するのにどれくらい時間がかかりますか?

あなたと他の開発者が一緒に作業するための強固なプラットフォームを持っているため、すべてのことを「タイト」にするコストを秤量します。

私が個人的に強く入力すると思うのは、ツリーに格納されているさまざまなタイプのビジネスロジックを変更すると、未知のバグではなくコンパイルが失敗するということです。

関連する問題