java子类问题

时间:2011-06-29 18:15:13

标签: java inheritance tree subclass

我有一个BinarySearchTree类,它是使用BinaryTree类构建的。现在我想通过继承RedBlackTree类来构建一个BinarySearchTree类。问题是BinaryTree类没有颜色字段。所以,我创建了一个ColorBinaryTree类,它是BinaryTree类的子类。这是我有点困惑的地方。在我的BinaryTree类中,我有以下方法

protected BinaryTree<E> parent(){
     return parent;
}

其中,父母显然是另一个BinaryTree。在我的RedBlackTree课程中,我还需要能够访问ColorBinaryTree个对象的父级。但是,我不能只使用从BinaryTree类继承的方法,因为它会返回一个BinaryTree对象,这意味着我无法访问该颜色。使用以下代码我收到错误

ColorBinaryTree<E> parent = newNode.parent();

其中newNodeColorBinaryTree个对象。因此,在我看来,唯一的方法就是在我的ColorBinaryTree sublcass中覆盖上述方法,如此。

@Override 
protected ColorBinaryTree<E> parent(){
     return parent;
}

我是否缺少某种方式来获取这个或者我是否只需要覆盖所有返回BinaryTree对象的方法?如果是这样,这似乎是一种浪费,因为方法的主体是完全相同的。

2 个答案:

答案 0 :(得分:5)

是的,您应该进行协变覆盖。这不是“浪费”,因为它约束parent的所有子类的ColorBinaryTree的返回类型。

答案 1 :(得分:1)

您是否有理由不投出超类的父函数的结果?

像这样:

ColorBinaryTree<E> parent = (ColorBinaryTree<E>)newNode.parent();

也是一种痛苦,但可能是你正在寻找的东西。

处理它的最佳方法是,可能会覆盖基类中返回BinaryTree的所有函数,并返回返回ColorBinaryTree的方法。然后在子类的实现中调用父方法并在返回之前执行转换。这样,您的代码中就不会有一百万个强制转换。它可能看起来像这样:

@Override
protected ColorBinaryTree<E> parent() {
    return (ColorBinaryTree<E>)super.parent();
}