3

我是初学者程序员,对 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);

    }
}

我尝试运行此代码,但错误提示我无法将对象类型节点转换为成员。

validate_member(root.go_left(), member_id)

validate_member(root.go_left(), member_id)

不允许我传入 Node 类型的对象。但是,据我了解,成员从节点继承,不允许传递节点?你如何解决这个问题?

Edit1:正如评论中有人指出的那样,我试图通过将 Node 类中的 go_left() 和 go_right() 函数覆盖到 Member 类来解决这个问题,但不知何故,它显示了一个错误,表明 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;}
}
4

2 回答 2

1

因为 Member 继承了 Node,你不能将 Node 类型的对象传递给函数,因为 Member 已经继承了 Node 类

不,恰恰相反:您可以将 a 传递给MemberNode参数的方法。

可以这样想:你调用root.get_member_id(),但如果root只是 aNode而不是 a Member,它就没有这个方法。

于 2018-05-21T08:45:21.017 回答
0

由于 Member 已经继承了 Node 类,你不能将 Node 类型的对象传递给函数吗?

不,它反过来。如果您将方法声明为

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) 

这是不正确的。所以这是不可能的。

你如何解决这个问题?

有两种方法。

  1. 覆盖Node中的方法并将左右变量添加到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)
    
于 2018-05-21T08:57:33.037 回答