2012-10-20 84 views
0

我在我的数据库中的动物表中有不同类型的动物行。实现此接口的典型方法

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

我有实现IAnimal接口(狗,猫等)

你重复记录检查类型,然后基于实例的类型正确的对象,然后调用他们发言方法不同动物类。

这是一种使用接口的典型方式吗?

+0

对不起,我不明白这一点。您能否提供一个代码或描述“接口”的含义? :) –

+1

@ProfrofoEGY我相当确定的OP意味着接口,如语言功能,是相当多的面向对象和(半)多态编程语言,如C#的一部分。 =) –

+0

在这种情况下,Animal应该是基础对象,而不是接口。一个接口实现了“有一个”关系。基础对象实现“是一个”关系。狗是“动物”。但一扇门“有一个”门铃。使用基类。 –

回答

4

你不需要关心你的对象的类型,如果你知道它实现了IAnimal。

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

检查reference,其中包括样本。

+0

假设创建对象时首先插入数组,并将其创建为正确的对象。但是,动物实际上是一个基类,而不是一个接口。 –

2

不,这不是典型的方式,基本上你会有一个方法需要一个接口的实例,那么你可以在那里调用Speak方法。你不必关心你传入的对象是什么具体类型,它的优点是你可以及时添加更多类型,而不必改变你的实现。

事情是这样的:

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

如果你试图代表在关系数据库中生成的类型,您有以下选择:

  1. 每个派生类型都有自己的表(例如不同猫,等)
  2. 你存储在动物表中的所有对象,并在列中指定类型
  3. 你有一个动物表与动物之间的共同列,以及特定列的单独表格。

看来,您选择的选项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; 
} 

这将允许呼叫者让所有动物说话,不管他们的基本类型的。当然,如果界面只有一种说法,它可能不是非常有用。

+0

为什么downvote? –

+0

我怀疑这是因为你自己没有回答这个问题 - 如果这是如何使用接口的话。 –

+0

@ J.Steen编辑答案...如果原始的downvoter也评论过,那会很好。 –

1

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

所以你有一个基类的动物。然后你有一类从动物继承的狗。

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

然后,您的调用函数可以迭代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; 
} 
+0

在理论上,你是对的。更多功能上,这全是关于你如何描述你的上下文。我们可以说任何动物“有一种”说话的方式,因此是IAnimal界面。一个接口是一个绑定一个类来呈现某种行为的契约。 –

+0

如果我在类型上使用switch语句,并且我有新的类型,我将不得不添加该case来切换语句并重新编译。你会如何避免这种情况? – Rod

+1

您可以使用System.Reflection和Activator。请参阅:http://msdn.microsoft.com/en-us/library/system.activator.aspx –