首页 > 解决方案 > 扩展以自身为成员的类

问题描述

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

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

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

标签: javaoopdesign-patternsbinary-treenodes

解决方案


实际上可以将 设置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();

推荐阅读