接口在设计应用程序时的主要优点以及继承方面的差异。任何机构都可以为我提供简要的例子。关于继承的接口和差异有什么用处
回答
接口和类之间的唯一区别是:
- 接口不能有实现
- 类只能是单继承
.NET类只能单独继承。但C++是这个问题的原始标记,它支持行为/实现和数据/状态以及接口的多重继承。 – 2010-07-20 22:41:25
@Ben:假设我们在谈论C++而不是C++/CLI,这是真的。 – 2010-07-20 22:53:21
接口最好的地方使用,其中:
- 概念级别的多个类共享功能,但实际上并不实际共享代码。
- 当提供者和用户之间存在硬性分离时,提供者不希望共享该类自身的任何细节。 (这并不一定意味着保密---在WCF,一类的用户&提供商可能由互联网分开;所述用户将需要具有的接口来访问远程对象)
对象定义其通过他们公开的方法与外部世界进行互动。方法形成对象与外界的接口;例如,电视机前面的按钮就是您和塑料外壳另一侧电线之间的接口。您按下“电源”按钮打开和关闭电视机。 在其最常见的形式中,接口是一组具有空体的相关方法。
的自行车的行为,如果指定为一个接口,可能会出现如下:
interface IBicycle {
void changeCadence(int newValue); // wheel revolutions per minute
void changeGear(int newValue);
void speedUp(int increment);
void applyBrakes(int decrement);
}
要实现这个接口,你的类的名称将发生变化(以某品牌自行车的,例如,如作为ACMEBicycle),你会使用implements关键字在类声明:
class ACMEBicycle : IBicycle {
// remainder of this class implemented as before
}
实现一个接口允许类变得更加正式的关于它承诺提供的行为。接口形成了类和外部世界之间的契约,并且这个契约在编译器的编译时执行。如果您的类声明实现了一个接口,那么在该类成功编译之前,由该接口定义的所有方法都必须出现在其源代码中。
您可以通过以下方式找到更多的信息检查Interface
与Class
之间的区别。
使用接口的一个优点是,您可以在单元测试期间使用模拟的对象。
例如当一种方法需要DbConnection
实例时,您必须提供它 - 在一个小型测试中这可能非常困难。但是当它需要IDbConnection
时,您可以提供样机。
SO上有一个标签“mocking”。
接口广泛用于许多高级设计模式。特别是如果应用程序设计使用任何类型的依赖注入或控制反转。
例如,插件(附加)模型典型地使用接口来定义该插件。将会有一个互操作库(DLL),严格版本化,它定义了应用程序可以使用任何插件来实现的接口。
应用程序项目引用互操作库,它允许任何实现这些接口的类,而不需要直接引用实际的类。
插件的具体实现引用了互操作库,因此它的类可以实现实现所需的接口。该应用程序对插件库没有直接的了解,插件库对该应用程序没有直接的了解。通过互通接口只能潜在地沟通。
在插件的情况下,是很常见的应用有一个指定的文件夹,插件的位置。在运行时,它扫描组件的文件夹,扫描每个组件,用于类/结构,会检查已知(互操作)接口,每个接口类/结构,并且动态地匹配任何插件它通过接口发现负载。根据机制的不同,每个插件通常会添加到某个菜单的某个位置,以便最终用户可以使用它。
在这个模型中,插件可以不必重新编译应用程序更新,而无需重新编译插件的应用程序可以被更新。 只要互操作库版本/签名不会更改,应用程序本身或单独的插件可以独立更新/修改/修复,而无需重新分发整个kit-n-kaboodle。
此外,为您的应用程序开发插件的第三方只需将重点放在实现来自interop的特定接口上,而不必关心应用程序如何使用它们的具体细节。
Icognito有一个很好的答案(我upvoted)。我只是想添加以下内容:
的接口定义任何执行对象必须具有方法签名。它使您的代码可以调用这些对象的方法,而无需了解其他任何信息。
一个类定义了方法签名并可以定义方法体和属性。一个类可以实现一个接口。这使您可以将数据和操作代码保持在一起。
Icognito的远程示例实际上比自行车更好。一台电视可能有这样的接口:
interface ITelevision {
void TogglePower();
void ChangeChannel(Int32 channel);
}
可能处理该接口一个连接对象将一个或多个电视对象和仿若对象:
class SonyTelevision: ITelevision {
public void TogglePower {
//Perform the operation to turn the TV on or off
}
public void ChangeChannel (Int32 channel) {
// Perform the operation of changing the channel
}
}
class ToshibaTelevision: ITelevision {
public void TogglePower {
//Perform the operation to turn the TV on or off
}
public void ChangeChannel (Int32 channel) {
// Perform the operation of changing the channel
}
}
class Remote {
private _television : Object; // here we don't care what kind of TV it is.
public void ToggleTvPower {
ITelevision tv = _television as ITelevision;
tv.TogglePower();
}
}
在上面,无论是索尼和东芝的制造商可能会为电视拥有自己的类层次结构。但是,它们都实现了通用的ITelevision接口,使得对这些类的编码更容易。
还要注意的接口意味着实现留给了实现类。只要每个人都使用ITelevision,任何遥控器都可以控制任何电视机。甚至将来的...
最后一点:抽象类与接口类似,因为抽象类需要后裔来提供方法体。但是,因为一个类只能从一个父类继承,而一个类可以实现尽可能多的接口。
- 1. 为什么泛型方法不能用于继承和接口?
- 2. 接口,继承和“新”的关键字
- 3. 多重继承与c#中的接口之间的差异
- 4. C#:关于接口,实现和继承的困惑
- 5. 接口评论和继承
- 6. 接口继承和铸造
- 7. c#MVC - 继承和接口
- 8. Java接口和继承
- 9. 接口和继承java
- 10. 古典继承差异
- 11. 什么有关涉及继承Java泛型和泛型的用处延伸自
- 12. 关于C#和继承
- 13. 关于继承和铸
- 14. 查询有关VB脚本和COM接口继承
- 15. ninject继承接口
- 16. C#接口继承
- 17. C#继承/接口
- 18. F#继承接口
- 19. 继承自通用接口
- 20. 非统一差异有什么好处?
- 21. 为什么继承接口的成员不能使用反射?
- 22. .NET类接口,继承和图书馆:误差不实现接口成员
- 23. java类继承和javabean继承之间有什么区别?
- 24. 关于多继承
- 25. ,继承和扩展有什么区别?
- 26. 继承和java豆有什么区别?
- 27. systemverilog中的继承和虚拟接口?
- 28. 差异的这些对象(Java继承)
- 29. Attribute.IsDefined vs MemberInfo.IsDefined - 继承参数的差异
- 30. 接口的多继承
比利,你为什么要将C++标签改为C++/CLI?这里没有任何内容表明Shadow对本地C++不感兴趣。 – 2010-07-20 22:40:18
@Ben:C++没有接口。鉴于这个问题也被标记为C#,他可能在谈论C++/CLI。 – 2010-07-20 22:52:55
'#define interface struct'现在C++有接口。实际上你会在Windows头文件中找到这个确切的宏。我想我们必须等待OP来权衡自己的C++是否对他有意思。 – 2010-07-21 00:20:37