C# 实现此接口的典型方法
我的数据库中的动物表中有不同类型的动物行 我有一个带Speak方法的IAnimal接口 我有不同的动物类来实现IAnimal接口狗、猫等 是否迭代类型的记录检查,然后根据类型实例化正确的对象,然后调用它们的Speak方法C# 实现此接口的典型方法,c#,C#,我的数据库中的动物表中有不同类型的动物行 我有一个带Speak方法的IAnimal接口 我有不同的动物类来实现IAnimal接口狗、猫等 是否迭代类型的记录检查,然后根据类型实例化正确的对象,然后调用它们的Speak方法 这是使用接口的一种典型方式吗?如果您知道对象实现了IAnimal,那么就不需要关心对象的类型 var animal = (IAnimal)animals[i]; animal.Speak(); 检查,其中包括示例。不,这不是典型的方式,基本上你会有一个方法来获取接口的实例,然
这是使用接口的一种典型方式吗?如果您知道对象实现了IAnimal,那么就不需要关心对象的类型
var animal = (IAnimal)animals[i];
animal.Speak();
检查,其中包括示例。不,这不是典型的方式,基本上你会有一个方法来获取接口的实例,然后你可以在那里调用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;
}
这将允许调用者让所有动物说话,而不管它们的基本类型。当然,如果接口只有一个speak方法,那么它可能不会非常有用。在本例中,您所谈论的关系类型是一种isa关系。狗是一种动物。面向对象设计中的关系是使用基类而不是接口实现的 所以你有一个动物的基类。然后你就有了一类从动物身上继承下来的狗 当您从数据库中检索数据时,您可以按其类型创建每个动物,但要添加到动物列表中 然后,调用函数可以遍历动物对象列表并调用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;
}
对不起,我不明白。您能否提供一个代码或描述接口的含义@PicrofoEGY我相当确定OP意味着接口,因为在语言功能中,它是许多面向对象和半多态编程语言的一部分,比如C.=在本例中,Animal应该是一个基本对象,而不是接口。接口实现了具有关系的。基本对象实现的是关系。狗是一种动物。但是门有门铃。使用基类。@J.Steen非常感谢您提供的信息。祝你有美好的一天:@scott.korin从它的使用方式来看,我不同意。每种动物都会说话。接口或多或少地告诉您可以做什么,是吗=假设在开始创建对象并将其插入阵列时,该对象被创建为正确的对象。但是,Animal实际上是一个基类,而不是一个接口。我怀疑这是因为你没有回答这个问题本身——如果这就是接口的使用方式。@J.Steen编辑答案。。。如果最初的反对者也发表评论那就太好了。从理论上说,你是对的。更重要的是,你如何描述你的环境。我们可以说,任何动物都有一种说话的方式,即IAnimal界面。接口是一个契约,它绑定一个类来表示某种行为。如果我在类型上使用switch语句,并且我有了一个新的类型,那么我必须将该案例添加到switch语句并重新编译。如何避免这种情况?可以使用系统反射和激活器。见此: