我有一些类的接口。为了方便描述我的任务:
IAnimal
Cat
Dog
Ape
..
现在,在Program.cs中,我填写了一个对象列表
List<IAnimal> animals = new..
animals.Add(new Cat {})
animals.Add(new Ape {})
...
完成后, 我想对这些对象采取一些行动。
animals.ForEach(a => doSomething(a));
我想做什么,取决于出现的类型。
void doSomething(IAnimal animal)
{
switch (animal.GetType().Name)
{
case "Dog":
parseDog(); // parts of a dog?
break;
...
}
}
我的问题,作为最终,如果我能使这个文本识别和切换方法更好。就像在界面中放置通用T,更好的使用类型或其他东西?
先谢谢了
答案 0 :(得分:4)
您正在重新发明虚拟方法。缓慢的方式。它是自动的接口,添加一个Parse()方法。现在很简单:
void doSomething(IAnimal animal)
{
animal.Parse();
}
它可能应该有一个论点......
答案 1 :(得分:1)
这听起来像是“错误的抽象”和违反Liskov Substitution的例子。如果您的doSomething()
方法依赖于传递给它的IAnimal
的特定实现,那么IAnimal
接口实际上并没有真正地抽象它。该方法不应该关心它得到什么实现,因为它的目的只需要IAnimal
上的内容。
您的“解析”方法是否可以添加到IAnimal
,以便您只需调用switch
而不是animal.Parse()
实现,并允许每个实现相应地处理它?如果只有Dog
具有该方法的有意义的实现,那么其他人可以只有空方法或抛出NotImplementedException
或者你想要处理它。
答案 2 :(得分:1)
你可以这样做:
void doSomething(IAnimal animal)
{
if (animal is Dog)
{
parseDog(); // parts of a dog?
}
else if (animal is Cat)
{
parseCat();
}
else if (animal is Ape)
{
...
}
}
但无论如何,这可能不是最好的方法......你应该DoSomething
IAnimal
的方法,并在每个IAnimal
实现中实现它
答案 3 :(得分:1)
嘿Jonas,如果你有一个接口确实定义了IAnimal,为什么不定义一个方法来处理这种类型特定的行为?实际上这是最好的方法,你将使用polimorphism!看一看;
public interface IAnimal
{
void Move();
}
public class Bird : IAnimal
{
public void Move()
{
//Realize that this is a type-specific behavior,
//which could be different for each class that
//implements IAnimal, NO NEED FOR UNBOXING
//or a bunch of IFS!!!
Console.WriteLine("Im flying!");
}
}
public class Horse : IAnimal
{
public void Move()
{
Console.WriteLine("Im running!");
}
}
//Then you may use it this way;
listOfIAnimals.ForEach(c => c.Move());
如果您仍想进行比较,最好的方法是使用“IS”关键字!
if(Bird is IAnimal)等等......!
答案 4 :(得分:0)
我认为最好使用Type,就像你做的那样,但是在放入typeof的情况下(Dog | Cat | ...)