クラスを使用して構築されたBinarySearchTree
クラスがあります。今度はBinarySearchTree
クラスをサブクラス化してRedBlackTree
クラスを構築したいと思います。問題は、BinaryTree
クラスに色のフィールドがないことです。そこで、BinaryTree
クラスのサブクラスであるColorBinaryTree
クラスを作成しました。ここで私はちょっと混乱します。私のBinaryTreeクラスでは、私は親が明らかに別のBinaryTree
で次のような方法javaサブクラスの質問
protected BinaryTree<E> parent(){
return parent;
}
を持っています。 RedBlackTree
クラスでは、ColorBinaryTree
オブジェクトの親にもアクセスできる必要があります。しかし、BinaryTree
クラスから継承したメソッドを使用することはできません。これはBinaryTree
オブジェクトを返します。これは、色にアクセスできないということを意味します。次のコードで、私はエラーnewNode
がColorBinaryTree
オブジェクトです
ColorBinaryTree<E> parent = newNode.parent();
を取得します。だから私にはそれを行う唯一の方法は私のColorBinaryTree
sublassassのように上のメソッドを上書きすることです。
@Override
protected ColorBinaryTree<E> parent(){
return parent;
}
私はこのaorund取得するにはいくつかの方法をしないのですか、私はちょうど行くとBinaryTreeオブジェクトを返すメソッドをすべてオーバーライドする必要がありますか?もしそうなら、メソッドの本体がまったく同じであるため、一種の浪費に見えます。
共変のオーバーライドと同じように型セーフではありません。すなわち、共変のオーバーライドは、 'ColorBinaryTree.parent()'が常に 'ColorBinaryTree'を返すことを保証します。普通の' BinaryTree'だけではありません。 –
"共変量オーバーライド"は私にとって新しい用語です。あなたは彼がそれぞれの方法のボディを書き直すことを提案していますか?それはわいせつでばかげているので、型の安全性が欠けていると思います。それはクラス階層のポイントを完全に凌駕します。一方、単に親クラスの 'BinaryTree'メソッドを子クラスの' ColorBinaryTree'を返すメソッドでオーバーライドしてそこでキャストを実行すると、私はあなたに同意します。 –
あなたが編集したキャストはうまくいきました。実装の詳細なだけであり、キャストが安全かどうかを知る必要はありません。 –