【问题标题】:java subclass questionjava子类问题
【发布时间】:2011-06-29 18:15:13
【问题描述】:

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

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

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

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

其中newNodeColorBinaryTree 对象。所以在我看来,唯一的方法就是像这样在我的ColorBinaryTree sublcass 中覆盖上述方法。

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

我是否缺少某种方法来解决这个问题,还是我只需要重写所有返回 BinaryTree 对象的方法?如果是这样,这似乎有点浪费,因为方法的主体完全相同。

【问题讨论】:

    标签: java inheritance tree subclass


    【解决方案1】:

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

    【讨论】:

    • 如果我有一个输入为 BinaryTree 类型的方法怎么办。我是否也应该覆盖这些并将输入类型更改为 ColorBinaryTree?
    • @jhlu87 是的,可能。这将确保某人实际上不会在期望 ColorBinaryTree 的地方发送 BinaryTree。它将帮助您更快地发现这种错误——在问题的根源上,而不是在没有颜色字段时爆炸。
    • +1 使用协变覆盖 - 它们非常适合这种情况。比类型转换好得多。
    【解决方案2】:

    你没有转换超类的父函数的结果有什么原因吗?

    像这样:

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

    也是一种痛苦,但可能是您正在寻找的。​​p>

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

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

    【讨论】:

    • 你可以,但它不像协变覆盖那样类型安全。即,协变覆盖保证ColorBinaryTree.parent() 总是返回ColorBinaryTree,而不仅仅是一个普通的BinaryTree
    • “协变覆盖”对我来说是一个新术语。您是否建议他重写每个方法的主体?这是淫秽和荒谬的,我会认为缺乏类型安全。这样做完全超越了阶级层次结构的意义。另一方面,如果您只是建议他用在子类中返回ColorBinaryTree 的方法覆盖父类中返回BinaryTree 的所有方法并在那里执行强制转换,那么是的,我同意你的看法。
    • 您在编辑中使用的演员表很好——这只是一个实现细节,不会让调用者担心演员表是否安全。
    • @Chris 是的,当然。更不用说它可以潜在地节省大量的击键。我以前从未听说过“协变覆盖”。无论我如何尝试,我都跟不上所有的术语。似乎一切都必须有一个名字......
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2021-03-04
    • 2021-11-12
    相关资源
    最近更新 更多