2011-06-29 8 views
2

クラスを使用して構築されたBinarySearchTreeクラスがあります。今度はBinarySearchTreeクラスをサブクラス化してRedBlackTreeクラスを構築したいと思います。問題は、BinaryTreeクラスに色のフィールドがないことです。そこで、BinaryTreeクラスのサブクラスであるColorBinaryTreeクラスを作成しました。ここで私はちょっと混乱します。私のBinaryTreeクラスでは、私は親が明らかに別のBinaryTreeで次のような方法javaサブクラスの質問

protected BinaryTree<E> parent(){ 
    return parent; 
} 

を持っています。 RedBlackTreeクラスでは、ColorBinaryTreeオブジェクトの親にもアクセスできる必要があります。しかし、BinaryTreeクラスから継承したメソッドを使用することはできません。これはBinaryTreeオブジェクトを返します。これは、色にアクセスできないということを意味します。次のコードで、私はエラーnewNodeColorBinaryTreeオブジェクトです

ColorBinaryTree<E> parent = newNode.parent(); 

を取得します。だから私にはそれを行う唯一の方法は私のColorBinaryTree sublassassのように上のメソッドを上書きすることです。

@Override 
protected ColorBinaryTree<E> parent(){ 
    return parent; 
} 

私はこのaorund取得するにはいくつかの方法をしないのですか、私はちょうど行くとBinaryTreeオブジェクトを返すメソッドをすべてオーバーライドする必要がありますか?もしそうなら、メソッドの本体がまったく同じであるため、一種の浪費に見えます。

答えて

1

スーパークラスの親関数の結果をキャストしない理由はありますか?あなたが探しているもの

ColorBinaryTree<E> parent = (ColorBinaryTree<E>)newNode.parent(); 

また、痛みの種類、おそらくこのよう

これを処理する最も良い方法は、おそらくColorBinaryTreeを返すメソッドでBinaryTreeを返す基本クラスのすべての関数をオーバーライドすることです。次に、子クラスの実装で親のメソッドを呼び出して、キャストを返してから戻ります。そうしたやり方で、あなたのコードに100万のキャストが広がっているわけではありません。

@Override 
protected ColorBinaryTree<E> parent() { 
    return (ColorBinaryTree<E>)super.parent(); 
} 
+0

共変のオーバーライドと同じように型セーフではありません。すなわち、共変のオーバーライドは、 'ColorBinaryTree.parent()'が常に 'ColorBinaryTree'を返すことを保証します。普通の' BinaryTree'だけではありません。 –

+0

"共変量オーバーライド"は私にとって新しい用語です。あなたは彼がそれぞれの方法のボディを書き直すことを提案していますか?それはわいせつでばかげているので、型の安全性が欠けていると思います。それはクラス階層のポイントを完全に凌駕します。一方、単に親クラスの 'BinaryTree'メソッドを子クラスの' ColorBinaryTree'を返すメソッドでオーバーライドしてそこでキャストを実行すると、私はあなたに同意します。 –

+1

あなたが編集したキャストはうまくいきました。実装の詳細なだけであり、キャストが安全かどうかを知る必要はありません。 –

5

はい、共変なオーバーライドを行う必要があります。これは、すべてのサブクラスがColorBinaryTreeの場合、戻りタイプがparentに制限されているため、「無駄」ではありません。

+0

私はBinaryTree型の入力を持つメソッドを持っている場合。それらをオーバーライドして、入力タイプをColorBinaryTreeに変更する必要がありますか? – jhlu87

+1

@ jhlu87うん、おそらく。これにより、ColorBinaryTreeが期待されるBinaryTreeで誰かが実際に送信しないようにします。それは色のフィールドを持っていない時に爆発するとき、問題の原因ではなく、ラインの下の - それはあなたがたくさん早くエラーのその種をキャッチお手伝いします。 –

+1

+1は共変のオーバーライドを使用するため、このシナリオに完全に適合します。型キャストよりもずっと優れています。 – Perception