我理解它们迫使你实现方法之类的东西,但我不能理解的是你为什么要使用它们。有没有人能给我一个很好的例子或者解释一下为什么我想要实现这个。
发布于 2008-10-27 14:56:06
一个具体的例子:接口是指定其他人的代码必须满足的约定的好方法。
如果我正在编写代码库,我可能会编写对具有特定行为集的对象有效的代码。最好的解决方案是在接口中指定这些行为(没有实现,只是描述),然后在我的库代码中使用对实现该接口的对象的引用。
然后,任何随机的人都可以出现,创建一个实现该接口的类,实例化该类的一个对象,并将其传递给我的库代码,并期望它能够工作。注意:当然,可以在忽略接口意图的情况下严格实现接口,因此仅仅实现接口并不能保证一切都会正常工作。愚蠢的人总能找到办法!:-)
另一个具体的例子:两个团队在不同的组件上工作,必须合作。如果两个团队在第一天坐下来就一组接口达成一致,那么他们就可以各自走自己的路,围绕这些接口实现他们的组件。团队A可以构建模拟团队B的组件进行测试的测试工具,反之亦然。并行开发,更少的bug。
关键的一点是,接口提供了一层抽象层,这样您就可以编写忽略不必要细节的代码。
大多数教科书中使用的的典型例子是排序例程。你可以对任何类别的对象进行排序,只要你有办法比较其中的任何两个对象。因此,您可以通过实现IComparable接口来使任何类可排序,该接口强制您实现用于比较两个实例的方法。所有的排序例程都是用来处理对IComparable对象的引用的,所以一旦实现了IComparable,就可以在类的对象集合上使用这些排序例程中的任何一个。
发布于 2008-10-27 14:57:49
接口定义contracts,这是关键字。
当您需要在程序中定义约定时,您可以使用接口,但是您并不真正关心履行该约定的类的其余属性。
那么,让我们来看一个例子。假设您有一个方法,它提供对列表进行排序的功能。第一件事..什么是列表?为了对列表进行排序,您真的关心它包含哪些元素吗?你的回答应该是不..。例如,在.NET中,您有一个名为IList的接口,它定义了列表必须支持的操作,因此您不必关心表面之下的实际细节。
回到示例中,您并不真正了解列表中对象的类……你们都不关心。如果你可以比较对象,你也可以对它们进行排序。所以你声明了一份合同:
interface IComparable
{
// Return -1 if this is less than CompareWith
// Return 0 if object are equal
// Return 1 if CompareWith is less than this
int Compare(object CompareWith);
}该契约规定,为了具有可比性,必须实现接受对象并返回int方法。现在您已经定义了一个约定,现在您不关心对象本身,而是关心约定,所以您可以这样做:
IComparable comp1 = list.GetItem(i) as IComparable;
if (comp1.Compare(list.GetItem(i+1)) < 0)
swapItem(list,i, i+1)PS:我知道这些例子有点幼稚,但它们是例子……
发布于 2008-10-27 14:58:11
一个典型的例子是插件架构。开发人员A编写主应用程序,并希望确保开发人员B、C和D编写的所有插件都符合其应用程序对它们的期望。
https://stackoverflow.com/questions/240152
复制相似问题