我有一个抽象类列表,如
List<Animal> animalList = new List<Animal>();
我通过
遍历列表foreach(Animal a in animalList.Values){
if(a is Monkey){
//Call monkey specific method
a.PeelBanana() //This is essentially what I would like to be able to do
}
else if(a is Giraffe){
//Call a method specific to Giraffe
}
}
所以这些动物有共同的功能,例如eat()和sleep(),但我想知道的是,是否有办法调用,例如,来自猴子类的PeelBanana(),一种根本不存在的方法动物类的派生。
答案 0 :(得分:4)
我建议你让Animal
成为一个抽象类,让Monkey
,Giraffe
和其他动物实现常用方法。它可能看起来像这样:
public abstract class Animal
{
public abstract void Eat();
...
}
public class Giraffe : Animal
{
public override void Eat()
{
// Giraffe eating
}
...
}
public class Monkey : Animal
{
public override void Eat()
{
this.PeelBanana();
this.EatBanana(); //Or something like this
}
...
}
然后就这样做
foreach(Animal a in animalList.Values){
a.Eat();
}
这是一种更加面向对象的解决方法。
答案 1 :(得分:3)
你必须先施展它:
if(a is Monkey){
((Monkey)a).PeelBanana();
}
但要小心这一点;如果你发现自己必须投射这样的物体,你的方法可能存在缺陷。严格来说,如果您使用的是List<Animal>
,那么您应该关注的是Animal
中定义的行为。