C# 覆盖方法、属性等还有多远。。。一个基类的,例如净树节点类

C# 覆盖方法、属性等还有多远。。。一个基类的,例如净树节点类,c#,.net,treeview,overriding,C#,.net,Treeview,Overriding,我正在开发一个应用程序,它使用TreeView控件来表示业务对象。目前,业务对象和TreeNode之间的链接是通过TreeNode的Tag属性维护的。我对此不是很满意,因为我认为这个联系不够紧密。例如,可能存在一个没有业务对象的TreeNode对象,我还想根据业务对象的状态更新TreeNode映像。因此,我从TreeNode派生了自己的特殊TreeNode类: class ActionTreeNode : TreeNode { private Action mAction;

我正在开发一个应用程序,它使用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;
      }
   }
使用这种最小的方法,每次调用返回TreeNode对象(如“(ActionTreeNode)myNode.Parent”中的基类的属性或方法时,我都必须强制转换。解决方案是重写每个方法或属性,并返回ActionTreeNode类型的对象。
您认为,采用最小方法更合适吗?还是您会努力重新实现所有方法、属性以避免强制转换?谢谢。

我喜欢最简单的方法。如果您担心代码会被大量的cast语句弄乱,只需在一个地方创建一个方法即可:

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…

我想问题是,要花多长时间才能使其强类型化

权衡一下使每个符号“紧凑”的成本,以及您和其他开发人员拥有一个坚实平台的成本


在不了解更多信息的情况下,我个人认为我会强烈地键入它,因为这也意味着对业务逻辑的任何更改(例如存储在树中的不同类型)都将导致编译失败,而不是可能的未知错误。

我也喜欢此版本。可能还应该重写以字符串作为参数的ActionTreeNode构造函数。