扩展自己作为成员的类

时间:2019-03-20 21:37:45

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

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

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

是否存在一种设计模式或某种可以应对这种情况的方法?还是有一个我看不到的简单解决方案?

1 个答案:

答案 0 :(得分:3)

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

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

但是,如果要从root对象获取它,则必须将其强制转换:

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

除此之外:如果您想自己实现此功能-假设它不是库中的 not -您可以创建一个通用的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();