Java:通用节点和树的继承

时间:2014-05-15 04:53:22

标签: java inheritance

出现以下问题: 我正在使用我自己的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类覆盖,那么继承泛型节点行为的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

您不需要ContactList中的根变量。如果ContactNode,您可以在构造函数或其他超类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>就足够了。