为什么我们要实现接口?

14

为什么我们要实现ICloneable或IDisposable接口?我不是在问ICloneable或IDisposable的作用,而是想了解相对于编写一个方法来释放或克隆对象,实现这些接口的好处是什么?

8个回答

21
使用接口可以使这些功能的使用保持一致。这样,当另一个类想要/需要使用您的类时,它可以将其视为可克隆、可丢弃的对象,而不必担心您特定的实现细节。

2
有时候我也会有同样的想法,但我不太确定是否正确,因为可能还有其他因素。但我的想法大致上是正确的 :) 非常感谢。 - Tarik

11

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

您可以查看维基百科关于多态性的文章了解更多信息。


5

因为您可能希望相同的代码适用于不同类的实例。例如,表单清理程序希望迭代所有组件并处理它们。为了做到这一点,它需要通过类型引用组件:可以是一个共同的基类或接口。单继承意味着一个共同的基类并不总是可行的(假设我的表单既有FileStream又有Button - 他们能拥有什么共同的基类让清理程序通过它们进行访问?);因此需要使用接口。


3

除了更多的接口智慧之外,接口可以用作消费者代码和服务代码之间的契约。与其说这是我们将处理的对象,不如使用接口来达成协议,这就是返回对象的样子。在代码中,可能是这样的:

服务代码

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

客户端代码:

var result = serviceProxy.GetNumbers();

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

除此之外,您还有其他应用程序,如IoC DI,单元测试和对象模拟。所有这些都能够获得多态好处。


2

除了其他原因外,阅读有关using块的内容。


我认为它用于处理未引用的对象。但我并不是在问那个 :) 好的,谢谢你的时间 :) - Tarik

2

Phoebus已经给了很好的回答,但我想再补充一点。

它会强制你编写期望进行克隆或创建可处理对象所需的方法。如果只需要编写方法,你是否总是包含所有必要的方法,或者签名是否总是相同?

如果有一个新的框架,他们添加了一些东西,来确保操作被正确地执行,通过使用接口,那么它会强制你实现任何新的更改,因为你的应用程序将无法编译。


2
总之,接口分离了实现并定义了结构,在需要实现可互换的情况下非常有用。除此之外,当实现经常变化时,接口也非常有用。
接口可以用于定义通用模板,然后使用一个或多个抽象类来定义接口的部分实现。
接口只指定方法声明(隐式公共和抽象),并且可以包含属性(这些属性也是隐式公共和抽象)。接口定义以关键字interface开头。与抽象类一样,接口不能被实例化。

2

接口将“做什么”与“如何做”分离。客户端处理接口类型,无需知道实现类是什么,因为他们可以依赖于它强制执行的契约。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接