我有一个班级TreeNode
,一个班级LeafNode
扩展TreeNode
,班级ParentNode
也扩展TreeNode
。在课程ParentNode
中,我有一个方法getChild
,它返回TreeNode
。
每当我连续拨打getChild
时,我都要做一堆向下转发。
LeafNode myLeafNode = (LeafNode) ((ParentNode) this.getChild(id1)).getChild(id2)
有没有办法可以避免所有这些向下转换而不改变程序的继承结构?
答案 0 :(得分:1)
如果孩子具有不适合父母的特定逻辑,则应该只扩展一个类。
我不确定为什么除了“Node”之外你还需要什么。 “Root”节点的行为与其他每个节点完全相同,如果您假设左右子节点可以为空,则“Leaf”的行为与节点完全相同(具有两个空子节点)
只是一条建议 - 很高兴知道“扩展”,但要小心过度使用它,我做了一个项目比通过过度使用扩展更难。大多数课程往往有一个非常简单的血统或根本没有。
每当你想要扩展一个对象时,我建议你首先考虑is-a / has-a规则,然后即使它是一个“is-a”尝试考虑遏制无论如何,如果遏制不多更难用的。从长远来看,它会让你的生活更轻松。
答案 1 :(得分:0)
如果方法getChild()
在TreeNode类中,那么我认为你不需要转换为ParentNode。
答案 2 :(得分:0)
如果getChild()
中定义了您尝试调用的方法(不仅是LeafNode
,还包括您计划用TreeNode
执行的任何操作),那么您不需要来回投掷。即使某些操作对叶节点(或非叶节点,无论哪个)都没有意义,您可以使用空实现定义它们,然后依赖您的代码只调用有效的(假设您的代码能够那样做。)