2012-01-18 24 views
2

私はクラスツリー(数学的表現のための抽象化)を作った。クラス 'Vertex'とフィールド 'Vertex head'を入れ子にしました。別のクラス 'BinaryTree'はTreeを拡張していますが、バイナリなのでより多くの可能性があり、頂点クラスが異なります(vertexメソッド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 
} 

は右この問題のオブジェクト指向の部分で私をAMは?または、ツリーからヘッドフィールドを削除し、それをそのサブクラスにのみ追加する必要があります。

ありがとうございます。

答えて

8

主な問題は、headフィールドの宣言された型ではなく、実行時の型です。サブクラスが独自の頂点を作成する唯一のクラスである場合、をhead変数に代入できます。ただし、追加の方法を使用する場合は、BinaryTree.Vertexにキャストする必要があります。

は、キャストを回避するには、Treeクラスがジェネリックにすることがあります。

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

public class BinaryTree extends Tree<BinaryVertex> { 

} 

は、ジェネリック医薬品の詳細については、javadocを参照してください。

関連する問題