2012-01-18 88 views
2

我做了一個類樹(數學表達式的抽象)。它嵌套了類「頂點」和「頂點頭」。另一個類「BinaryTree」擴展了Tree,但它具有更多的可能性,因爲它是Binary,它們有不同的頂點類(我添加到頂點方法giveRight和giveLeft),這就是爲什麼我使用嵌套類的繼承。但我有場從樹頭,它沒有giveRight方法等等......這裏有一個例子:面向對象編程。子類的域

class Tree{ 
    class Vertex{ 
     //smth 
    } 
    Vertex head; 
} 

class BinaryTree extends Tree{ 
    class Vertex extends Tree.Vertex{ 
     //added methods... 
    } 
    //problem with head element, it is element of Tree.Vertex 
} 

我說的對這個問題的面向對象的一部分?或者我應該從樹中刪除頭字段,並將其僅添加到它的子類中。

謝謝。

回答

8

主要問題不是head字段的聲明類型,而是其運行時類型。如果子類是唯一創建自己的頂點的子類,則它可以將BinaryTree.Vertex分配給head變量。不過,如果您想使用其他方法,則必須將其轉換爲BinaryTree.Vertex

爲了避免轉換,你可以使樹類通用:

public class Tree<V extends Vertex> { 
    protected V head; 
} 

public class BinaryTree extends Tree<BinaryVertex> { 

} 

關於泛型更多信息,請參閱javadoc