2016-08-12 8 views
0

以下のロジックは、AppleLeaf、MangoLeaf、およびBananaLeafの3つのクラスをすべて拡張しています。 Leafクラス。私は葉オブジェクトだけを取るメソッドを持っています。クラスの型に基づいて、以下のメソッドに正しくリダイレ​​クトする必要があります。 しかし、私はあなたがそのように自動的にアップキャストすることはできませんように、「タイプのメインのメソッドhandleLeaf(AppleLeaf)は、引数には適用されません(リーフ)」というエラーメソッドをオーバーライドして基本クラスを取得し、拡張クラスを指導するメソッドの実装

public void main(String args[]){ 

     for (Leaf leaf : leafList) { 
     handleLeaf(leaf);  
    } 
} 

private void handleLeaf(AppleLeaf node) { 
    String colour = leaf.getColour(); 
    System.print.out(colour); 
} 

private void handleLeaf(MangoLeaf mLeaf) { 
    Int veins = mLeaf.getVeinCount; 
    System.print.out(veins); 
} 

private void handleLeaf(BananaLeaf bLeaf) {  
    Boolean withered = bLeaf.getTexture(); 
} 
+2

サブクラスは、すべての子タイプを知るためにスーパークラスに頼るのではなく、独自の 'handleLeaf'メソッドを処理しないのはなぜですか? –

答えて

1

これはあまり効果がありません。 3つのメソッドを定義しましたが、いずれもパラメータとしてLeafを使用しません。それぞれがLeafのサブクラスを取りますが、与えられた引数がどのサブクラスであるかはわかりません。Leafです。あなたはしかし、一般的にあなたのロジックを再加工検討することができる

private void handleLeaf(Leaf leaf) { 
    if(leaf instanceof AppleLeaf) 
     handleLeaf((AppleLeaf)leaf); 
    else if(leaf instanceof MangoLeaf) 
     handleLeaf((MangoLeaf)leaf); 
    ...//And so on 
} 

一つの回避策は、次のような委譲メソッドを作ることです。おそらく、あなたは、Leafクラスで抽象メソッドを定義するために物事を回すことができ、すべてのリーフタイプを独自のメソッド定義で処理させることができます。

+0

は** handleLeaf((AppleLeaf)leaf); **は** handleLeaf(AppleLeaf leaf)と同じです**;私はtahtメソッドの実装方法を変えなければならないのでしょうか? – yellow

+0

@yellow \t Java継承のポイントがありません。スーパークラスは、サブクラスを識別し、そのサブクラスに基づいて独自のメソッドの1つにディスパッチする責任を負うべきではありません。各サブクラスはハンドラ関数を持つ必要があり、スーパークラスはそれを呼び出す必要があります。スーパークラスはメソッドを実装し、例外をスローする必要があります。したがって、サブクラスがそのハンドラを実装することを忘れた場合、エラーです。または、抽象メソッドとして宣言する必要があります(つまり、スーパークラスのインスタンスをインスタンス化できません)。 –

+0

@yellow \tいいえ、後者はコンパイルされないという点で同じではありません。このコードは 'Leaf'の実装をチェックし、各' Leaf'インスタンスを対応する型にキャストします。しかし、これはほぼすべての状況で悪いアプローチです。 –

0

を取得します。あなたが探しているのは動的メソッドバインディングです。これはJavaにはありません。 Javaはコンパイル時にリンクされた言語なので、コンパイル/実行されません。

関連する問題