Расширяет класс, который имеет себя в качестве члена - PullRequest
0 голосов
/ 21 марта 2019

Предположим, мне нужно использовать библиотеку, в которой есть класс, реализующий двоичное дерево, с такой подписью:

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 Ответ

3 голосов
/ 21 марта 2019

На самом деле можно установить 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();
...