明らかに、ここで問題を単純化しようとしています。基本クラスといくつかの派生クラスがあります。
public class Mammal { }
public class Cat : Mammal { }
public class Dog : Mammal { }
そしてユーティリティクラス:
public static class AnotherClass
{
public static void GiveFood(Cat cat) {}
public static void GiveFood(Dog dog) {}
}
他の場所には、Mammal を受け取るメソッド Feed があり、そこから、AnotherClass で適切なオーバーロードを呼び出したいと考えています。
public void Feed(Mammal mammal) {
// if mammal is a cat, call the AnotherClass.GiveFood overload for cat,
// if it's a dog, call the AnotherClass.GiveFood for dog, etc.
}
それを行う1つの方法は、次のようなことです。
public void Feed(Mammal mammal) {
if (mammal is dog)
AnotherClass.GiveFood((Dog)mammal);
if (mammal is Cat)
AnotherClass.GiveFood((Cat)mammal);
}
……でも、実は哺乳類由来の動物が結構いるんです。Feed() でやりたいことを行うためのより良い方法はありますか? Feed() がこれらの「if x is y then call z」ステートメントで満たされた巨大な醜いメソッドになることを避ける方法はありますか?