Как расширить класс с членом его собственного типа? - PullRequest
0 голосов
/ 27 апреля 2018

Предположим, нам нужно реализовать различные типы деревьев с классом "BaseNode", из которого получены другие типы узлов, и предполагается, что переменная экземпляра называется parent своего собственного типа, как правило, это выглядит так:

class BaseNode{
   //...some fields
   BaseNode parent;
   //...other methods
}

Теперь, если я собираюсь получить Node для дерева AVL с большим количеством членов:

class AVLNode extends BaseNode{
    //...other useful stuff

}

исходные элементы узла parent (& left & right) по-прежнему будут иметь тип BaseNode, что не позволяет мне реализовать дерево AVL. Кто-нибудь, кто мог бы сказать мне, как мы могли бы решить эту проблему наследования? Спасибо!

1 Ответ

0 голосов
/ 27 апреля 2018

Решение 1 - Каждый раз, когда вы получаете доступ к parent, приведите его к (AVLNode) parent. Вы можете написать аксессор в AVLNode, чтобы сделать его более удобным.

class AVLNode extends BaseNode {
    public AVLNode getParent() {
        return (AVLNode) parent;
    }
}

Решение 2 - Сделать BaseNode универсальный класс, который принимает подкласс в качестве параметра. Теперь parent может быть точным нужным типом.

class BaseNode<T extends BaseNode<T>> {
    T parent;
}

class AVLNode extends BaseNode<AVLNode> {
}
...