为什么我们要实现接口?

问题描述:

我们为什么要实施,例如ICloneable或IDisposable。我不是在问ICloneable或IDisposable是做什么的,但我想知道实现这些接口的一个很好的理由,而不是仅仅写一个方法来处理或克隆我们的对象。为什么我们要实现接口?

使用接口保持对这些功能块的使用保持一致。这样,当另一个类想要/需要使用你的类时,它可以作为一个可复制的一次性对象,而不用担心你的特定实现细节。

+2

有时候我在想同样的事情,但我不太确定,因为会有其他的东西,但我对我的想法有点正确:)非常感谢。 – Tarik 2009-10-18 01:14:47

除其他原因外,请阅读using块。

+0

我认为它用于处理未引用的objects.But我没有问:)非常感谢您的时间:) – Tarik 2009-10-18 01:15:36

因为您可能需要相同的代码来操作不同类的实例。例如,表单清理例程想要迭代所有组件并处理它们。为了做到这一点,它需要通过一种类型引用组件:一个公共基类或一个接口。单一继承意味着一个普通的基类并不总是可行的(假设我的表单同时具有一个FileStream和一个Button--它们有哪些常用的基类,清理例程可以通过它们访问它们)?因此接口。

通过实现一个众所周知的接口,您可以拥有多态性,使您能够编写能够对实现给定接口的类的任何实例进行操作的通用代码。

您可以查看Wikipedia article on polymorphism了解更多信息。

Phoebus给出了一个很好的答案,但增加了一点。

它迫使你编写克隆或制作可以处理的东西的方法。如果你不得不只写这个方法,你会不会包含所有必要的方法,或者签名总是一样的?

如果有一个新的框架中,还会添加一些东西,以帮助确保操作正确,具有接口,那么它迫使你实施任何新的变化,因为你的应用程序将不再编译。

总之,接口分离了实现并定义了结构,这个概念在需要实现可互换的情况下非常有用。除此之外,当实现频繁更改时,接口非常有用。

接口可以被用来定义一个通用的模板,然后一个或多个抽象类来定义的接口的部分实现。

接口只是指定方法声明(隐式公开和抽象),并且可以包含属性(它们也是隐式公开的和抽象的)。接口定义从关键字接口开始。类似抽象类的接口不能实例化。

添加到多个接口的智慧,接口可以作为消费者的代码和服务代码之间的合同。我没有说这是我们将要处理的对象,而是协议的接口,这就是我返回的对象的外观。在代码中,它可能是这样的:

服务代码

public IEnumerable<int> GetNumbers(){ return new []{1,2,3,4,5}; } 

客户端代码:

var result = serviceProxy.GetNumbers(); 

这里的服务代码,可以改变执行返回满足IEnumerable的任何一类不破坏客户代码。

除此之外,您还有其他应用程序,如IoC DI,单元测试,对象模拟。所有这些收获多态善良的好处。

一个接口将已完成的工作与已完成的工作分开。客户端处理接口类型,而不必知道实现类是什么,因为它们可以依赖它实施的合同。

这对于生成动态代理的情况很重要。客户不需要知道他们正在处理代理,这使您可以*地注入所需的任何行为。这是面向方面编程的常用技术。