从C#中的抽象列表调用对象特定方法

时间:2013-12-04 22:21:31

标签: c# oop

我有一个抽象类列表,如

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(),一种根本不存在的方法动物类的派生。

2 个答案:

答案 0 :(得分:4)

我建议你让Animal成为一个抽象类,让MonkeyGiraffe和其他动物实现常用方法。它可能看起来像这样:

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中定义的行为。