实现此接口的典型方法

时间:2012-10-20 20:46:46

标签: c#

我的数据库中的Animals表中有不同类型的动物行。

我有一个带有Speak方法的IAnimal接口。

我有不同的动物类来实现IAnimal接口(Dog,Cat等)

您是否迭代记录检查类型,然后根据类型实例化正确的对象,然后调用它们的Speak方法。

这是使用接口的典型方法吗?

4 个答案:

答案 0 :(得分:4)

如果您知道它实现了IAnimal,则无需关心对象的类型。

var animal = (IAnimal)animals[i];
animal.Speak();

检查reference,其中包含样本。

答案 1 :(得分:2)

不,这不是典型的方法,基本上你有一个方法接受了接口的实例,然后你可以在那里调用Speak方法。您不必关心传入的对象的具体类型,这样做的好处是您可以及时添加更多类型,而不必更改您的实现。

这样的事情:

public void Speak(IAnimal animal)
{
    animal.Speak();
}

答案 2 :(得分:1)

如果您尝试在关系数据库中表示派生类型,则可以使用以下选项:

  1. 每个派生类型都有自己的表格(例如Dog,Cat等不同的表格)
  2. 将所有对象存储在Animal表中,并在列中指定类型
  3. 您有一个Animal表,其中包含动物之间的公共列,以及特定列的单独表。
  4. 您似乎已选择了选项2.

    通常使用IAnimal接口作为方法的返回类型或参数到另一个方法,而不是在实例化后立即调用speak方法。

    例如,以下代码可能对接口使用有意义:

    public IList<IAnimal> GetAnimals()
    {
        var animals = new List<IAnimal>();
        foreach(var animal in db.Animals)
        {
            animals.add( // instantiate new animal here)
        }
        return animals;
    }
    

    这将允许呼叫者使所有动物说话,而不管其潜在类型。当然,如果界面只有说话方法,它可能不是非常有用。

答案 3 :(得分:1)

在这种情况下,您所谈论的关系类型是“是一种”关系。狗是动物。 “是否”面向对象设计中的关系是使用基类实现的,而不是使用接口。

所以你有一个基类Animal。然后你有一类继承自Animal的狗。

当您从数据库中检索数据时,您可以创建每种动物的类型,但添加到动物列表中。

然后,您的调用函数可以遍历动物对象列表并调用Speak,而无需知道每个对象是什么。

public void MakeAnimalsSpeak()
{
    // gets your animals from the database
    List<Animal> animals = GetAnimals();

    foreach(Animal animal in animals)
    {
        animal.Speak();
    }
}

private List<Animals> GetAnimals()
{
    List<Animal> animalsToReturn = new List<Animal>();

    // get data from db

    // loop through data

        // switch on "type" field, create correct object.

        // add too List.

    return animalsToReturn;
}