Java - Полиморфизм и дизайн классов объектов - PullRequest
1 голос
/ 13 апреля 2020

Я пытаюсь практиковать дженерики и полиморфизм. У меня есть класс Node следующим образом:

public class Node<T> {
    public T name;
    public Node[] children;
}

Затем обобщенный c Класс дерева:

public class Tree<T> {
    public Node<T> root;
}

Теперь я пытаюсь реализовать двоичное дерево. Бинарное дерево является деревом , таким образом, удовлетворяющее является правилом полиморфизма. Я борюсь с тем, как добиться того, чтобы узлы в двоичных деревьях могли иметь максимум двух дочерних элементов.

Должен ли я расширять класс узлов до двоичного узла, а дочерний массив всегда инициализируется до размера 2? Если BinaryTree расширяет Tree, как мне наложить ограничение на переменную-член children ?

Как будто я пытаюсь сделать:

BinryTree extends Tree
BinaryTreeNode extends Node

Где Node - это переменная-член в Tree, а BinaryTreeNode - это переменная-член в BinaryTree. Каким будет правильный дизайн?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Как насчет:

public class Node<T> {
public T name;
public Node[] children;
public Node(int numOfChildren) { children = new Node[numOfChildren]; }
}

Если вы хотите, чтобы узел содержал 2 узла, вызовите конструктор с 2, таким образом дочерние элементы будут содержать до 2 узлов. Также было бы лучше использовать инкапсуляцию и сделать детей приватными и обеспечить доступность с помощью методов получения и установки:

public class Node<T> {
public T name;
private Node[] children;

public Node(int numOfChildren) { children = new Node[numOfChildren]; }

public Node[] getChildren() { return children; }
}
0 голосов
/ 13 апреля 2020

Вот что я закончил с приведенными выше предложениями. Класс узла:

public abstract class Node<T> {
    protected T value;
    protected Node[] children;
}

BinaryTreeNode

public class BinaryTreeNode<T> extends Node {
    public BinaryTreeNode() {
        children = new BinaryTreeNode[2];
    }

    public BinaryTreeNode(T value) {
        this.value = value;
        children = new BinaryTreeNode[2];
    }

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return (T)value;
    }

    public BinaryTreeNode left() {
        return (BinaryTreeNode)children[0];
    }

    public BinaryTreeNode right() {
        return (BinaryTreeNode) children[1];
    }

    public void setLeft(BinaryTreeNode<T> leftNode) {
        children[0] = leftNode;
    }

    public void setRight(BinaryTreeNode<T> rightNode) {
        children[1] = rightNode;
    }
}

Класс дерева:

public abstract class Tree<T> {
    public Node<T> root;
}

BinaryTree:

public class BinaryTree<T> extends Tree<T> {

    public BinaryTree() {
        root = new BinaryTreeNode<>();
    }

    public void visit(Node node) {
        System.out.println(node.value);
    }

    public void inOrderTraversal(BinaryTreeNode node) {
        if(node != null) {
            inOrderTraversal(node.left());
            visit(node);
            inOrderTraversal(node.right());
        }
    }
}

Прошу прощения за продолжительный комментарий , Благодарю за любые отзывы по улучшению дизайна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...