2016-05-03 16 views
0

微妙な問題に対処する明確かつ適切な方法を探しています。テクニカルなはい、私は単にそれを無視することができますが、それはポイントではありません。継承によるメソッドパラメータの変更

私はNode型のオブジェクトを利用するBinaryTreeクラスを持っています。 BinaryTreeクラスには、バイナリツリーのルールに従って新しいノードを追加するaddNode(Node n)メソッドがあります。

今、RedBlackNode型のオブジェクトを使用するRedBlackTreeクラスを作成します。 )、BinaryTreeから継承します。私はaddNodeメソッドをそのままにしてはいけません。通常のノードをRedBlackTreeに追加することができ、エラーが発生するからです。私はこのようなメソッドをオーバーロードすることができます:

class RedBlackTree extends BinaryTree 
{ 
    public void addNode(RedBlackNode n) 
    { 
     ... 
    } 
} 

が、その後、他の方法がまだ公開され、理想的には、それはすべきではありません。 私はこのようなメソッドをオーバーライドすることができます:

が、その後方法はまだパラメータとして、通常のノードをとり、理想的にはそれだけで(彼はメソッドを使用しようとしたとき、それは他の誰かを混乱させる可能性)RedBlackNodeを受け入れる必要があります。

私が望むのは、パラメータタイプがNodeからRedBlackNodeに変更されるようにaddNodeメソッドを継承することです。それ、どうやったら出来るの?それも可能ですか?それとも私の側の概念上の問題ですか?

+5

単にジェネリックを使用するのはなぜですか?私はこのような状況は、彼らが言語に追加されたものだと考えました。 –

+0

かなり正確に: 'class BinaryTree ' 'クラスRedBlackTreeはBinaryTree 'を継承します。 – Ironcache

答えて

1

次のようなもののために行くことができます:

class BinaryTree<E extends Node>{ 
    public void add(E e){ 
    } 
} 

class RedBlackTree extends BinaryTree<RedBlackNode>{ 
    @Override 
    public void add(RedBlackNode e) { 
    } 
} 

次に、あなたがあなたのRedBlackTreeにあなたのバイナリツリーが、唯一の特定のノードに任意のノードを渡すことができます。