我有一個BinarySearchTree實現,它實現如下接口Tree
的公共insert
方法。如何處理此類可見性問題?
public class BinarySearchTree<T extends Comparable<T>> implements Tree<T> {
public boolean insert(T value) {
Node<T> nodeInserted = insertValue(value); //call private method to insert.
return (nodeInserted != null);
}
protected Node<T> insertValue(T value) {
//insert the node and then return it.
}
public Node<T> search(T value) {
//search and return node.
}
//Node class for BST
public static class Node<T extends Comparable<T>> {
// Fields and getters and setters.
}
}
的想法是,其他的派生類(例如AVL)樹將覆蓋方法insertValue爲: '
public class AVLTree<T extends Comparable<T>> extends BinarySearchTree<T> {
@Override
protected Node<T> insertValue(T id) {
//specific code to insert node in AVL
}
// AVL Node
public static class AVLNode<T extends Comparable<T>> extends Node<T> {
// Fields and getters/ setters
}
}
現在我有另一個類TreeMap中其可以使用RB樹或AVL來實現樹。我想重新使用AVL的代碼:
public class TreeMap<K extends Comparable<K>, V> implements Map<K,V> {
private AVLTree<K> tree = null;
@Override
public V put(K key, V value) {
//Here is the problem.
}
}
的問題是:我要插入關鍵屬性爲AVL樹中的節點,然後需要獲得插入節點的保持和做一些處理工作。我既不能覆蓋也不能獲得AVLTree類的insertValue()。
一個選項它調用插入方法並獲得布爾結果。檢查它是否爲真,然後再次調用搜索方法來獲取節點,然後進行處理。有沒有其他更好的解決方案來解決這個問題?
我還需要一個建議。我已將類別Node
聲明爲僅與BST
有關。我需要AVL的另一個節點類,並考慮擴展靜態類節點。爲了讓Node在另一個包中可見,我不得不聲明公共,以便它可用於AVLNode。有沒有任何設計問題?
節點的一個對象應該與BinarySearchTree密切相關,這就是爲什麼它是靜態嵌套類。 AVLTree也需要也是Node的節點類,所以我發現它適合於擴展Node。 如果Node受到保護,我無法在AVLTree定義的其他包中看到它,所以必須公開它。然後它擴展了靜態嵌套類節點。 恕我直言,我相信我們沒有Java中的靜態內部類。我們不? –
這樣使用,我不知道,但否則它是一個相當普遍的事情:Map.Entry(公共接口),HashMap.Node(用作實現細節的私有類),Rectangle2D.Double和Rectangle2D.Float(public ,用於提供雙精度和浮點精度相同的功能)...在你的情況下,我感到困擾的是它似乎是一個實現細節,所以我不希望它是公開的 – Dici
我認爲使用Node就像一個私人靜態類只作爲HashMap中的Node類。現在AVLNode也是Node,所以我想擴展Node類,但如果它是私有的(或保護的),它將不能用於某些其他包中的派生類AVLTree。 所以即使我想不出任何其他整潔的解決方案。 –