出现以下问题: 我正在使用我自己的Tree类,这是一般的。另一个类,一个联系人列表,继承自该Tree类。我这样做的原因是,还有其他类都需要相同的树功能,但它们有不同的用途。
节点也是通用节点,也可以继承特殊节点类型,如电话列表,电子邮件联系人列表等。
在Tree类中,有一些方法使用局部变量Node
。在联系人列表树中,我需要这个相同的变量是Contact
(继承自Node)。当我使用联系人列表中的一个方法时,它将根节点定义为Node
而不是Contact
,因此它使用通用节点而不是继承的节点。
这就是它的样子:
public class Tree {
Node root;
public void insert( String x ) {
root = insert( x, root );
}
这是联系人列表(root的类型为Contact
(扩展了Node):
public class ContactList extends Tree {
Contact root;
这是Node
:
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类覆盖,那么继承泛型节点行为的正确方法是什么?
答案 0 :(得分:0)
您不需要ContactList
中的根变量。如果Contact
是Node
,您可以在构造函数或其他超类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 extends 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);
答案 1 :(得分:0)
使用泛型。修改树和节点以具有以下通用类型:
Tree<T extends Tree<T,N>,N extends Node<T,N>>
Node<T extends Node<T,N>,N extends Node<T,N>>
然后在他们的字段和方法中仅使用泛型类型T和N.这允许你有f.e.子类
ContactTree extends Tree<ContactTree,ContactNode>
ContactNode extends Node<ContactTree,ContactNode>
请注意,如果您的ContactTree最终没有任何方法或字段,那么普通的Tree<N extends Node>
就足够了。