假设我必须使用一个具有实现二叉树的类的库,其签名如下:
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
是否存在一种设计模式或某种可以应对这种情况的方法?还是有一个我看不到的简单解决方案?
答案 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();