0

我有一个类TreeNode,一个LeafNode扩展TreeNode的类和一个ParentNode扩展的类TreeNode。在类中,ParentNode我有一个getChild返回TreeNode.

每当我getChild连续调用时,我都必须做一堆向下转换。

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

有没有办法在不改变程序继承结构的情况下避免所有这些向下转换?

4

3 回答 3

1

仅当子级具有不适合父级的特定逻辑时,您才应该扩展一个类。

我不确定为什么除了“节点”之外你还需要其他任何东西。“根”节点的行为与其他所有节点完全相同,如果您假设左右子节点可以为空,则“叶”的行为与节点完全相同(具有两个空子节点)

只是一条建议——很高兴了解“扩展”,但要小心过度使用它,我通过过度使用扩展使项目变得比以前更难。大多数类往往有一个非常简单的血统或根本没有。

每次你想扩展一个对象时,我建议你首先考虑 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 回答