0

ここでは Java の初心者です。

Banana and Apple extend Fruit( FruitFruit はインスタンス化されないため、抽象クラスである可能性もあります)。

BananaAppleどちらも(大きく異なる)toString()メソッドを持っています。

どこかのメソッド -- 呼びましょう--がパラメータとしてprocessFruit(Fruit fruit)受け入れられ、ログの目的で実際に受信したメソッド (バナナまたはリンゴのいずれか) を呼び出します。どうすればいいですか?FruittoString()Fruit

私は fruit.toString() を実行し、実際の果物に基づいて Apple.toString() または Banana.toString() メソッドを実行したいと考えています。

やりたくないこと(リンゴやバナナだけでなく、果物もたくさんあるので):

  1. コードが同一であるため、との2 つの異なるprocessFruitメソッドがあります。processFruit(Banana banana)processFruit(Apple apple)
  2. 受け取った果物を Apple または Banana にダウンキャストし、そのtoString()メソッドを呼び出します

他に方法があるはずですが、私には見えません。

4

2 に答える 2

2

私は fruit.toString() を実行し、実際の果物に基づいて Apple.toString() または Banana.toString() メソッドを実行したいと考えています。

既存のパラメーターなしのメソッドを実際にオーバーライドしている限り、これはまさに自動的に行われることです。toString()これがメソッドのオーバーライドの仕組みです。

toString()( で宣言されている)以外のメソッドに対してこれを行う場合はObject、 で抽象メソッドを作成し、Fruitそれを各サブクラスに実装します。その後、任意のインスタンスで呼び出すことができFruit、適切な実装が呼び出されます。

完全な例:

import java.util.*;

abstract class Fruit {
    public abstract String getColor();
}

class Banana extends Fruit {
    @Override public String getColor() {
        return "yellow";
    }
}

class Apple extends Fruit {
    @Override public String getColor() {
        return "green";
    }
}

public class Test {

    public static void main(String[] args) {
        List<Fruit> list = new ArrayList<Fruit>();
        list.add(new Banana());
        list.add(new Apple());

        for (Fruit fruit : list) {
            System.out.println(fruit.getColor());
        }
    }
}

詳細については、Java チュートリアルの継承の部分を参照してください。

于 2013-10-27T09:12:08.970 に答える
0

電話するだけfruit.toString()です。果物がバナナの場合、バナナのtoString()メソッドが呼び出されます。Apple の場合、Apple のtoString()メソッドが呼び出されます。それがポリモーフィズムのすべてです。

于 2013-10-27T09:13:31.537 に答える