0

私はクラスTreeNodeLeafNode拡張TreeNodeするクラスParentNode、拡張するクラスを持ってTreeNodeいます。クラスには、を返すParentNodeメソッドがあります。getChildTreeNode

連続して呼び出すたびにgetChild、大量のダウンキャストを行う必要があります。

LeafNode myLeafNode = (LeafNode) ((ParentNode) this.getChild(id1)).getChild(id2)

プログラムの継承構造を変更せずに、このすべてのダウンキャストを回避する方法はありますか?

4

3 に答える 3

1

子に親にとって不適切な特定のロジックがある場合にのみ、クラスを拡張する必要があります。

「ノード」以外が必要な理由がわかりません。「ルート」ノードは他のすべてのノードとまったく同じように機能し、左右の子ノードが空になる可能性があると仮定すると、「葉」はノードとまったく同じように機能します (2 つの空の子ノードを持つ)。

ちょっとしたアドバイスです。「extends」について知っておくと便利ですが、使いすぎには注意してください。extends を使いすぎて、必要以上にプロジェクトを難しくしてしまいました。ほとんどのクラスは、系統が非常に単純であるか、系統がまったくない傾向があります。

オブジェクトを拡張することを考えるたびに、最初に is-a/has-a ルールについて考え、それが「is-a」であってもとにかく封じ込めを検討することをお勧めします。封じ込めがそれほど難しくない場合は、単に使用するだけですそれ。長期的には、あなたの人生を楽にしてくれます。

于 2013-07-25T20:21:03.000 に答える
0

メソッドgetChild()が TreeNode クラスにある場合、ParentNode へのキャストは必要ないと思います。

于 2013-07-25T17:42:01.243 に答える
0

呼び出そうとしているメソッド (だけでなく、それを見つけたらgetChild()それで何をしようとしているのか) が で定義されている場合は、前後にキャストする必要はありません。一部の操作がリーフ ノード (または非リーフ ノードのいずれか) に対して意味をなさない場合でも、それらを空の実装で定義し、有効なノードのみを呼び出すためにコードのみに依存することができます (コードがそれを行う)。LeafNodeTreeNode

于 2013-07-25T17:48:09.160 に答える