обход дерева с классом узла, наследуемым другим классом - PullRequest
0 голосов
/ 21 мая 2018

Я начинающий программист и совершенно новичок в Java.Все работает хорошо, за исключением того, что я не могу пройти по этому дереву.

public class Node extends Utility {
    protected Node left;
    protected Node right;

    public Node() {this.left = null; this.right = null;}
    public Node go_left() {return this.left;}
    public Node go_right() {return this.right;}
    public void connect_left(Node connection) {this.left = connection;}
    public void connect_right(Node connection) {this.right = connection;}
}

public class Member extends Node{
    protected String Name;
    protected int id;

    public Member() {
        this.Name = null;
        this.id = 0;
    } 

    public Member(String Name, int id){
        this.Name = Name;
        this.id = id;
    }

    public int get_member_id() {return id;}

    public String get_status() {return status;}
}

public class MemberList{
    protected Member m_root;
    public MemberList() {
        this.m_root = null;
    }

    public int validate_member_wrapper (int member_id){
        return validate_member(this.m_root, member_id);
    }

    protected int validate_member(Member root, int member_id) {
        if(root == null)
            return -1;
        if(root.get_member_id() == member_id) {
            if(root.get_status().compareToIgnoreCase("Active") == 0)
                return 1;
            else
                return 0;
        }

        if(root.get_member_id() < member_id)
            return validate_member(root.go_left(), member_id);
        else
            return validate_member(root.go_right(), member_id);

    }
}

Я попытался запустить этот код, но ошибка говорит, что я не могу преобразовать объект типа Node в Member.

validate_member(root.go_left(), member_id)

и

validate_member(root.go_left(), member_id)

не позволяют мне передавать объект типа Node.Однако, насколько я понимаю, член, унаследованный от узла, не разрешает пропускать узел?Как это исправить?

Edit1: Как кто-то указал в комментарии, я попытался исправить это, переопределив функции go_left () и go_right () в классе Node к классу Member, но каким-то образом это показалоошибка говорит о том, что Узел не может быть преобразован в Член.

Вот изменения

public class Node extends Utility {
    protected Node left;
    protected Node right;

    public Node() {this.left = null; this.right = null;}
    public Node go_left() {return this.left;}
    public Node go_right() {return this.right;}
}

public class Member extends Node{
    protected String Name;
    protected int id;

    public Member() {
        this.Name = null;
        this.id = 0;
    } 

    public Member(String Name, int id){
        this.Name = Name;
        this.id = id;
    }

    public Member go_left() {return this.left;}
    public Member go_right() {return this.right;}

    public int get_member_id() {return id;}

    public String get_status() {return status;}
}

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Не могли бы вы передать объект типа узла в функции, так как элемент уже унаследовал класс узла?

Нет.Это наоборот.Если вы объявите метод равным

protected int validate_member(Node root, int member_id) 

, то для ввода потребуются как член, так и узел.

Например.Рассмотрим другой класс

public class Leaf extends Node{

Лист не является членом, поэтому, если вы создаете объект листа

Node leaf =new Leaf();

и пытаетесь отправить этот узел на

protected int validate_member(Member root, int member_id) 

itбыло бы неправильно.Так что это невозможно.

Как решить эту проблему?

Существует два способа.

  1. Переопределить методыот узла и добавьте левую и правую переменные в класс Member (рекомендуется)

    public Node go_left() {return this.left;}
    public Node go_right() {return this.right;}
    

    до

    public Member go_left() {return this.left;}
    public Member go_right() {return this.right;}
    protected Member left,right;
    
  2. Тип приведение во время вызоваметод (небезопасный)

    validate_member((Member)root.go_left(), member_id)
    
0 голосов
/ 21 мая 2018

, поскольку Member унаследовал Node, вы не могли передать объект типа Node в функции, поскольку Member уже унаследовал класс Node

Нет, все наоборот: вы можете передать Memberв метод с параметром Node.

Думайте об этом так: вы звоните root.get_member_id(), но если root это просто Node, а не Member, у него нет этого метода.

...