2

Food というクラスがあり、Banana、Apple、Orange という派生クラスがあるとします。どこかに FoodProcessor メソッドがあり、ほとんどの場合、あらゆるタイプの食品を処理できますが、バナナの皮をむく、バナナの皮をむくなど、タイプ固有の何かを行うために、処理している食品のタイプを知る必要がある場合がありますリンゴ、またはオレンジを絞ります。

したがって、FoodProcessor は Food 引数を取ります。FoodProcessor が Food インスタンスの特定の派生型を検出するための最良の方法は何ですか?

4

4 に答える 4

2

ポリモーフィズムを使用する必要があります。各Foodサブクラスはメソッドを定義しprocess()FoodProcessorクラスはそのメソッドを呼び出すだけです。

フードプロセッサー

public void process(Food f) {
    f.process(); 
}

アップル

public void process() {
    Console.WriteLine("Core the apple.");
}

バナナ

public void process() {
    Console.WriteLine("Peel the banana.");
}

オレンジ

public void process() {
    Console.WriteLine("Squeeze the orange.");
}

このようにして、Food とそのサブクラスの間の継承関係を利用します。

于 2013-02-13T21:57:38.090 に答える
1

私はそれを抽象化し、各食品に実装します。

abstract class Food {
    public abstract void Prepare();
}

class Banana : Food {
    public override void Prepare() {
        Peel();
    }
}

class Apple : Food {
    public override void Prepare() {
        Core();
    }
}

次に、次のようになります。

class FoodProcessor {
    public void Process(Food food) {
        food.Prepare(); // preparation of the food
        food.Process();
    }
}
于 2013-02-13T21:59:58.580 に答える
1

オブジェクトのタイプをテストするときは、次のようにisキーワードを使用するのが好きです。

if(myFood is Bannana)
  Peel((Bannana)myFood);

isオブジェクトがインターフェイスを実装しているかどうかもチェックするので、私はそれを好みます。

インターフェイスについて言えば、特定のアクションを実行する特定のタイプがある場合は、インターフェイスの使用を検討することをお勧めします。特定のタイプをチェックするには、使用される可能性のあるさまざまなタイプの知識が必要ですが、インターフェイスをチェックすると、コードを変更して処理する必要なく、このインターフェイスを実装する新しいタイプが出現する可能性があります。

if(myFood is IPeelable)
  Peel((IPeelable)myFood)
else if(myFood is ICoreable)
  Core((ICoreable)myFood)

特定のタイプを探す場合、考えられるすべてのタイプを現在および将来的に知る必要がありますが、これはあまりスケーラブルではありません。

もちろん、これは、他の回答の1つが説明しているように、ストレートポリモーフィズムを使用したくないことを前提としています。

于 2013-02-13T22:00:23.200 に答える
-1
void FoodProcessor(Food food)
{
    if(food is Banana)
        ...
    else if(food is Apple)
        ...

    ...
    etc
}

編集:他の回答で述べたようにポリモーフィズムを使用できる場合は、これを無視してください

于 2013-02-13T21:57:18.213 に答える