为什么接口有用?
实际上,我对接口有用/必要的原因有一点了解,但是......
接口的[有趣或现实]应用是什么?
答案 0 :(得分:4)
接口非常有趣,因为您可以允许2个类实现相同的方法。让我们看一个例子。
假设我有一个名为Animal的基类。所有动物都呼吸,并进行交流。现在假设我有3个班,名为Dolphin,Human和Tiger。所有这些动物都呼吸和交流。但是我想为人类和老虎实施一种步行方法。海豚不能走路。所以我继承了后两者的IWalk方法,当我编译类时,我必须实现接口中指定的方法,否则它将无法编译。这是一份合同,“如果我想实现这个类,我必须实现这些方法。”
答案 1 :(得分:2)
我对接口的一个用途是帮助单元测试难以模拟的框架类。我将创建一个与框架类和实现接口的包装类基本相同的接口。包装类的构造函数将框架类的实例作为参数。包装器将它支持的接口功能委托给框架类,但是我实现了我的接口而不是框架。使用该接口使我可以轻松地在单元测试中模拟包装类的功能 - 使用模拟框架或提供一个假类,该类也实现接口并通过依赖注入将其提供给通常依赖的任何类在框架类上。
答案 2 :(得分:1)
它们允许多态而没有继承的一些坏的方面。
继承的不良方面是什么意思?
代码和数据沿着长链继承(使其不那么明显)
在继承树中某处覆盖的继承成员。
你如何使用多态?
避免重复自己。创建使用接口而不是实现接口的对象的函数,开关或条件。
Java特定
在Java中,使用接口作为获得多重继承的方法通常是有意义的
如果某些东西自然地适合两个类别并且您对它们都有预期的单独行为,那么这是有道理的。
来自网络的一些Java示例
http://home.cogeco.ca/~ve3ll/jatutor5.htm
http://java.freehep.org/lib/freehep/doc/root/index.html
http://www.codeguru.com/java/tij/tij0080.shtml
答案 3 :(得分:1)
接口(或抽象类)是您与编译器一起传递的合约。这份合同说:
- 好吧,编译器,确保所有实现此功能的类将提供至少此接口中定义的所有内容!
通过这种保险,您可以编写操纵实现此接口的任何类的对象的方法:
void myGenericMethod( IAnInterface genericObject )
myGenericMethod方法可以使用接口IAnInterface的任何成员。它永远不会抛出运行时错误(任何缺少的成员都会被编译器捕获)。
实用程序:为不同的对象提供一些常见的行为。例如,您可能希望能够在任何对象上调用名为GetID的方法,无论是BankAccount,ComputerCluster还是AirplaneTrip。
在大多数设计模式中,您会发现许多有用的界面用法。 MSDN提供了有关何时应在此处使用界面的一些提示:http://msdn.microsoft.com/en-us/library/27db6csx.aspx
答案 4 :(得分:0)
正如tvanfosson所提到的,对于模拟非常有用,如果你编写一个依赖于外部配置的库,你可以创建一个IFooProvider并让调用程序实现它。
答案 5 :(得分:0)
我认为你的意思是编程语言意义上的“界面”,而不是其他意义,例如“用户界面”。
Java或C#等语言的接口有两个目的。第一种是提供一种类型的合同来实施;一组方法名称和签名,该类型提供给使用它的其他类型。第二种是在该类型的接口上提供多态性。例如,如果我有一个实现IFoo接口的类型,我可以将该类型的实例传递给另一个类,其他类只需要知道IFoo接口,而不是我的类实现IFoo的每个细节。
答案 6 :(得分:0)
当您希望允许两个不共享公共类层次结构的类之间的互操作性时,接口非常有用。
一个很好的例子是 java.lang.CharSequence 。许多其他东西可以被抽象地视为字符串,但是将String子类化为不可能是正确的。实际上String是最终的,所以无论如何都无法完成。
有一段时间围绕JDK 1.4(我相信?)引入了CharSequence接口。现在,String,StringBuffer,CharBuffer和JDK中的许多其他现有类实现它。有了这个,可以将新方法添加到接受CharSequence的其他API中,允许它们以统一的方式抽象地处理所有这些。
您也可以自己实现此界面并以相同的方式使用它。实现一个通用接口比尝试和强制从特定基类扩展(或有时不可能)更灵活。
答案 7 :(得分:0)
我更倾向于将接口视为实现类的每个实例来实现角色的描述,而与任何实现继承层次结构无关。
通过类比,您可以根据团队中某些职位的互动方式来描述“屏幕传球”足球比赛。就位置(或角色或界面)而言,该描述与哪个玩家恰好在给定时间玩该位置无关。这也与球队是否碰巧有一些能够打多个位置的天才球员无关。
面向接口思维的优势在于它将重点放在对象在与其他对象的给定交互中实现的角色,而不关心对象在其他类型的交互中可能扮演的任何其他角色。它还允许测试专注于与角色相关的场景(以及在测试场景中模拟或伪造角色)。