针对复杂类型的接口拆箱

时间:2011-04-06 14:32:08

标签: c# .net

我有一些类的接口。为了方便描述我的任务:

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,更好的使用类型或其他东西?

先谢谢了

5 个答案:

答案 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 | ...)