基本クラスのメソッド、プロパティなどをどこまでオーバーライドするか。.net TreeNode クラス
-
05-07-2019 - |
質問
私は、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 タイプのオブジェクトを返すことです。最小限のアプローチをとるのがより適しているのか、それともキャストを避けるためにすべてのメソッドやプロパティを再実装する努力をするのか、どう思いますか?ありがとう。
解決
最小限のアプローチが好きです。大量のキャストステートメントでコードが乱雑になるのが心配な場合は、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チェックを忘れないでください...
他のヒント
問題は、それを強力に型付けするための労力にどれくらい時間がかかるかだと思います。
すべてを「タイト」にするコストと、あなたや他の開発者が作業するための強固なプラットフォームを持つコストを天秤にかけてください。
詳細はわかりませんが、個人的には、ツリーに異なる型を格納するなど、ビジネス ロジックに変更を加えると、未知のバグの可能性ではなく、コンパイルの失敗が発生する可能性があるため、これを強く型付けると思います。