为什么我们要实现接口?

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

使用接口可以保持这些function的使用一致。 这样,当另一个类想要/需要使用您的类时,它可以作为可克隆的一次性对象对其进行操作,而不必担心您的特定实现细节。

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

您可以查看有关多态性的维基百科文章以获取更多信息。

因为您可能希望相同的代码对不同类的实例进行操作。 例如,表单清理例程想要遍历所有组件并处理它们。 为了实现这一点,它需要通过类型引用组件:公共基类或接口。 单inheritance意味着公共基类并不总是可行的(假设我的表单同时具有FileStream和Button – 它们可以使用哪个公共基类,清理例程将通过它来访问它们?); 因此接口。

添加更多界面智慧,接口可以用作消费者代码和服务代码之间的契约。 而不是说这是我们将要处理的对象,通过协议的接口,这就是我返回的对象的外观。 在代码中,它可能是这样的:

服务代码

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

客户代码:

 var result = serviceProxy.GetNumbers(); 

在这里,服务代码可以更改实现,以返回满足IEnumerable的任何类,而不会破坏客户端代码。

除此之外,您还有其他应用程序,如IoC DI,unit testing,对象模拟。 所有这些都获得了多态性的好处。

除其他原因外,请阅读有关using块的信息。

Phoebus给出了一个很好的答案,但要补充一点。

它会强制您编写克隆所需的方法或制作可以处理的方法。 如果你只需要编写方法,是否总是包含所有必要的方法,或者签名是否总是相同?

如果有一个新的框架,并且他们添加了一些内容,以帮助确保操作正确完成,那么通过使用接口,它会强制您实现任何新的更改,因为您的应用程序将不再编译。

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

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

接口只指定方法声明(隐式公共和抽象),并且可以包含属性(也隐式公共和抽象)。 接口定义以关键字interface开头。 像抽象类那样的接口无法实例化。

界面将完成的内容与其完成方式分开。 客户端处理接口类型,而不必知道实现类是什么,因为它们可以依赖它强制执行的契约。

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