防止过度倾斜

时间:2013-07-25 17:37:27

标签: java oop downcast

我有一个班级TreeNode,一个班级LeafNode扩展TreeNode,班级ParentNode也扩展TreeNode。在课程ParentNode中,我有一个方法getChild,它返回TreeNode

每当我连续拨打getChild时,我都要做一堆向下转发。

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

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

3 个答案:

答案 0 :(得分:1)

如果孩子具有不适合父母的特定逻辑,则应该只扩展一个类。

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

只是一条建议 - 很高兴知道“扩展”,但要小心过度使用它,我做了一个项目比通过过度使用扩展更难。大多数课程往往有一个非常简单的血统或根本没有。

每当你想要扩展一个对象时,我建议你首先考虑is-a / has-a规则,然后即使它是一个“is-a”尝试考虑遏制无论如何,如果遏制不多更难用的。从长远来看,它会让你的生活更轻松。

答案 1 :(得分:0)

如果方法getChild()在TreeNode类中,那么我认为你不需要转换为ParentNode。

答案 2 :(得分:0)

如果getChild()中定义了您尝试调用的方法(不仅是LeafNode,还包括您计划用TreeNode执行的任何操作),那么您不需要来回投掷。即使某些操作对叶节点(或非叶节点,无论哪个)都没有意义,您可以使用空实现定义它们,然后依赖您的代码只调用有效的(假设您的代码能够那样做。)