2016-05-03 96 views
0

我正在寻找处理细微问题的清晰且正确的方法。 Technicaly是的,我可以简单地忽略它,但这不是重点。通过继承更改方法参数

我有一个BinaryTree类,它利用Node类型的对象。 BinaryTree类有一个方法addNode(Node n),它根据二叉树的规则添加一个新节点

现在我想创建一个RedBlackTree类,该类使用RedBlackNode类型的对象(Node有一个额外的颜色字段)并从BinaryTree继承。我不应该离开addNode方法,因为它允许将正常的节点添加到RedBlackTree,导致错误。我可以像这样超载的方法:

class RedBlackTree extends BinaryTree 
{ 
    public void addNode(RedBlackNode n) 
    { 
     ... 
    } 
} 

但其他方法仍然是暴露的,理想情况下,它不应该是。 我可以覆盖这样的方法:

但随后的方法仍然需要一个正常的节点作为参数,并且理想地应该只接受RedBlackNode(当他试图使用方法也可能混淆别人)。

我想要的是继承addNode方法,使参数类型从Node更改为RedBlackNode。我怎么做?这甚至可能吗?或者这是我的一个概念性问题?

+5

为什么不简单地使用泛型?我认为这种情况是他们被添加到语言中的。 –

+0

非常正确:class BinaryTree 类RedBlackTree扩展了BinaryTree Ironcache

回答

1

你可以去像下面这样:

class BinaryTree<E extends Node>{ 
    public void add(E e){ 
    } 
} 

class RedBlackTree extends BinaryTree<RedBlackNode>{ 
    @Override 
    public void add(RedBlackNode e) { 
    } 
} 

然后你就可以通过任一节点到您的二叉树,但只有特定的节点到您的RedBlackTree