我的数据库中的Animals表中有不同类型的动物行。
我有一个带有Speak方法的IAnimal接口。
我有不同的动物类来实现IAnimal接口(Dog,Cat等)
您是否迭代记录检查类型,然后根据类型实例化正确的对象,然后调用它们的Speak方法。
这是使用接口的典型方法吗?
答案 0 :(得分:4)
答案 1 :(得分:2)
不,这不是典型的方法,基本上你有一个方法接受了接口的实例,然后你可以在那里调用Speak
方法。您不必关心传入的对象的具体类型,这样做的好处是您可以及时添加更多类型,而不必更改您的实现。
这样的事情:
public void Speak(IAnimal animal)
{
animal.Speak();
}
答案 2 :(得分:1)
如果您尝试在关系数据库中表示派生类型,则可以使用以下选项:
您似乎已选择了选项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;
}