我有一个BinarySearchTree
类,它是使用BinaryTree
类构建的。现在我想通过继承RedBlackTree
类来构建一个BinarySearchTree
类。问题是BinaryTree
类没有颜色字段。所以,我创建了一个ColorBinaryTree
类,它是BinaryTree
类的子类。这是我有点困惑的地方。在我的BinaryTree类中,我有以下方法
protected BinaryTree<E> parent(){
return parent;
}
其中,父母显然是另一个BinaryTree
。在我的RedBlackTree
课程中,我还需要能够访问ColorBinaryTree
个对象的父级。但是,我不能只使用从BinaryTree
类继承的方法,因为它会返回一个BinaryTree
对象,这意味着我无法访问该颜色。使用以下代码我收到错误
ColorBinaryTree<E> parent = newNode.parent();
其中newNode
是ColorBinaryTree
个对象。因此,在我看来,唯一的方法就是在我的ColorBinaryTree
sublcass中覆盖上述方法,如此。
@Override
protected ColorBinaryTree<E> parent(){
return parent;
}
我是否缺少某种方式来获取这个或者我是否只需要覆盖所有返回BinaryTree对象的方法?如果是这样,这似乎是一种浪费,因为方法的主体是完全相同的。
答案 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();
}