【问题标题】:Extends class that has itself as a member扩展以自身为成员的类
【发布时间】:2019-08-11 17:25:40
【问题描述】:

假设我必须使用一个具有实现二叉树的类的库,其签名如下:

class Node {
    public void setN0(Node n);
    public void setN1(Node n);
    public Node getN0();
    public Node getN1();
}

所以,我想创建一个扩展它的类,在它上面放置一个图形层,比如

class UINode extends Node {
    private int coordinateX;
    private int coordinateY;
}

但我不能这样做,因为它不可能将 UInode 传递为 Node 子节点,例如

UINode root = new UINode();
UINode n0 = new UINode();
UINode n1 = new UINode();
root.setN0(n0);  //Not possible
root.setN1(n1);  //Not possible

是否有设计模式或其他东西来处理这种情况?或者有一个我看不到的简单解决方案?

【问题讨论】:

  • 有可能。如果UINodeNode,那么您可以将它传递给任何采用Node 的方法。
  • 是什么让你相信这是不可能的?

标签: java oop design-patterns binary-tree nodes


【解决方案1】:

实际上可以将UINode 设置为Node 的子级:

UINode root = new UINode();
UINode n0 = new UINode();
root.setN0(n0);  // possible

但如果你想从 root 对象中获取它,你必须强制转换它:

UINode n = (UINode) root.getN0();

除此之外:如果您想自己实现它 - 假设它不是在库中 - 您可以创建一个通用的 Node 类:

class Node<T extends Node> {
    public void setN0(T n);
    public void setN1(T n);
    public T getN0();
    public T getN1();
}

现在您可以在 UINode 中扩展此类:

class UINode extends Node<UINode> {
    // ...
}

并在没有强制转换的情况下使用它:

UINode root = new UINode();
root.setN0(new UINode());

UINode n = root.getN0();

【讨论】:

    猜你喜欢
    • 2021-07-27
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2013-10-21
    • 2012-07-05
    相关资源
    最近更新 更多