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