2009-05-05 41 views
2

我正在處理一些應用程序,它使用TreeView控件來表示業務對象。目前,業務對象和TreeNode之間的鏈接通過TreeNode的Tag屬性來維護。我對此並不滿意,因爲我認爲這個鏈接不夠「緊」。例如,可能有沒有業務對象的TreeNode對象,我也想根據業務對象狀態更新TreeNode圖像。因此,我得出的樹節點用自己獨特的樹節點類:重寫基類的方法,屬性等有多遠.net TreeNode class

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; 
     } 
    } 

有了這個最小的方法,我要投我每次調用返回一個TreeNode對象像基類的屬性或方法「時間(ActionTreeNode)MYNODE .Parent」。解決方法是覆蓋/覆蓋每個方法或屬性並返回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 
} 

不要忘記在返回值空校驗不過,如若父母不是一個ActionTreeNode ...

+0

我也喜歡這個版本。也許應該重寫字符串作爲參數的ActionTreeNode ctor。 – crauscher 2009-05-05 10:00:48

2

我認爲問題是需要多長時間才能完成強類型化工作。

重要的是讓您的每一個「緊」成本與您和其他開發人員擁有一個可靠的平臺一起工作的成本。

不知道更多,我個人認爲我會強烈地鍵入它,因爲這也意味着任何對業務邏輯的更改(如存儲在樹中的不同類型)都會導致編譯失敗,而不是可能發生的未知錯誤。