我在我的数据库中的动物表中有不同类型的动物行。实现此接口的典型方法
我有一个Speak方法的IAnimal接口。
我有实现IAnimal接口(狗,猫等)
你重复记录检查类型,然后基于实例的类型正确的对象,然后调用他们发言方法不同动物类。
这是一种使用接口的典型方式吗?
我在我的数据库中的动物表中有不同类型的动物行。实现此接口的典型方法
我有一个Speak方法的IAnimal接口。
我有实现IAnimal接口(狗,猫等)
你重复记录检查类型,然后基于实例的类型正确的对象,然后调用他们发言方法不同动物类。
这是一种使用接口的典型方式吗?
你不需要关心你的对象的类型,如果你知道它实现了IAnimal。
var animal = (IAnimal)animals[i];
animal.Speak();
检查reference,其中包括样本。
假设创建对象时首先插入数组,并将其创建为正确的对象。但是,动物实际上是一个基类,而不是一个接口。 –
不,这不是典型的方式,基本上你会有一个方法需要一个接口的实例,那么你可以在那里调用Speak
方法。你不必关心你传入的对象是什么具体类型,它的优点是你可以及时添加更多类型,而不必改变你的实现。
事情是这样的:
public void Speak(IAnimal animal)
{
animal.Speak();
}
如果你试图代表在关系数据库中生成的类型,您有以下选择:
看来,您选择的选项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;
}
这将允许呼叫者让所有动物说话,不管他们的基本类型的。当然,如果界面只有一种说法,它可能不是非常有用。
为什么downvote? –
我怀疑这是因为你自己没有回答这个问题 - 如果这是如何使用接口的话。 –
@ J.Steen编辑答案...如果原始的downvoter也评论过,那会很好。 –
在这种情况下,您所谈论的关系类型是“是”关系。一只狗是一种动物。 “是否”面向对象设计中的关系是使用基类来实现的,而不是使用接口。
所以你有一个基类的动物。然后你有一类从动物继承的狗。
当您从数据库中检索数据时,您将创建每个动物的类型,但添加到动物列表中。
然后,您的调用函数可以迭代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;
}
在理论上,你是对的。更多功能上,这全是关于你如何描述你的上下文。我们可以说任何动物“有一种”说话的方式,因此是IAnimal界面。一个接口是一个绑定一个类来呈现某种行为的契约。 –
如果我在类型上使用switch语句,并且我有新的类型,我将不得不添加该case来切换语句并重新编译。你会如何避免这种情况? – Rod
您可以使用System.Reflection和Activator。请参阅:http://msdn.microsoft.com/en-us/library/system.activator.aspx –
对不起,我不明白这一点。您能否提供一个代码或描述“接口”的含义? :) –
@ProfrofoEGY我相当确定的OP意味着接口,如语言功能,是相当多的面向对象和(半)多态编程语言,如C#的一部分。 =) –
在这种情况下,Animal应该是基础对象,而不是接口。一个接口实现了“有一个”关系。基础对象实现“是一个”关系。狗是“动物”。但一扇门“有一个”门铃。使用基类。 –