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

C# 在C语言中从抽象列表调用特定于对象的方法#,c#,oop,C#,Oop,我有一个抽象类列表,比如 List<Animal> animalList = new List<Animal>(); 因此,动物有着共同的功能,比如eat()和sleep(),但我想知道的是,是否有办法从monkey类调用PeelBanana(),这是一种在动物类的所有派生中都不存在的方法。您必须先转换它: if(a is Monkey){ ((Monkey)a).PeelBanana(); } 不过,要小心这一点;如果你发现自己必须像这样投射对象,你的方法可

我有一个抽象类列表,比如

List<Animal> animalList = new List<Animal>();

因此,动物有着共同的功能,比如eat()和sleep(),但我想知道的是,是否有办法从monkey类调用PeelBanana(),这是一种在动物类的所有派生中都不存在的方法。

您必须先转换它:

if(a is Monkey){
    ((Monkey)a).PeelBanana();
}

不过,要小心这一点;如果你发现自己必须像这样投射对象,你的方法可能有缺陷。严格地说,如果您使用的是
列表
,那么您应该关心的是
动物
中定义的行为。我建议您将
动物
作为一个抽象类,并使
猴子
长颈鹿
和其他动物实现通用方法。它可能看起来像这样:

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();
}

这是一种更加面向对象的解决方法。

这是违反面向对象编程规则的典型例子。这正是我想要的。我试过(猴子)a.PeelBanana(),但这更有意义,谢谢。是的,我现在有点意识到了。在理想情况下,我可能会创建一个抽象方法,比如PrepareFood(),猴子可以覆盖它来实现PeelBanana()功能??听起来更符合OOP设计原则,是的-假设它适用于
动物的所有子类型
+1-听起来他已经得出了这个结论,但这正是我的答案。我将@AntP问题标记为答案,因为这基本上是我在原始问题中想要的,但这个问题以及评论也促使我这么做做一些设计上的改变。谢谢
foreach(Animal a in animalList.Values){
    a.Eat();
}