gpt4 book ai didi

Java:通用节点和树的继承

转载 作者:太空宇宙 更新时间:2023-11-04 14:51:52 25 4
gpt4 key购买 nike

遇到以下问题:我正在使用我自己的通用树类。另一个类,即联系人列表,继承自该 Tree 类。我这样做的原因是,还有其他类都需要相同的树功能,但它们有不同的目的。

该节点也是一个通用节点,并且还继承了特殊的节点类型,例如电话列表、电子邮件联系人列表等。

在 Tree 类中,有一些使用局部变量 Node 的方法。在联系人列表树中,我需要这个相同的变量作为 Contact (继承自 Node)。当我使用联系人列表中的其中一种方法时,它将根节点定义为 Node 而不是 Contact,因此它使用通用 Node 而不是继承的节点。

它是这样的:

public class Tree {

Node root;

public void insert( String x ) {
root = insert( x, root );
}

这是联系人列表(根的类型为 Contact(扩展 Node):

public class ContactList extends Tree {

Contact root;

这是节点:

public class Node {

String idString;
Node leftChild;
Node rightChild;

public Node() {}

public Node(String idString) {
this.idString = idString;
}

}

如何判断继承的方法插入不使用本地root,而是使用继承类的根。

我尝试在 ContactList 的构造函数中解决这个问题:

public ContactList() {
super.root = this.root;
}

没用。我认为它会立即被 Tree 类覆盖,那么继承通用节点行为的正确方法是什么?

最佳答案

您不需要 ContactList 中的根变量。如果Contact是一个Node,您可以在构造函数或父类(super class)Tree的其他方法中轻松分配它:

public class Tree {

Node root;

public Tree(Node root) {
this.root = root;
}

public void insert( String x ) {
root = insert( x, root );
}
}

对于ContactList:

public class ContactList extends Tree {

public ContactList(Contact contact) {
super(contact);
}
...
}

假设Contact 扩展了Node。现在,当您在 ContactList 实例上调用继承的方法时,将使用 Contact 实例。

ContactList list = new ContactList(new Contact(...));
list.insert("X");

但如果你想删除Contact和Node之间的继承关系,你应该使用 Java Generic :

public class Tree<T> {
T root;

public void insert(T node) {
...
}
}

然后:

Tree contactTree = new Tree<Contact>();
...
contactTree.insert(Contact c);

关于Java:通用节点和树的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23669516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com