Oop 接口使用问题

Oop 接口使用问题,oop,language-agnostic,Oop,Language Agnostic,为什么接口似乎与类完全相同,而只是函数声明。界面的主要好处是什么?除了多个类共享一个接口,但它仍然感觉像什么?每个类都有自己的实现,因此为什么要使用接口?在静态类型的面向对象语言中,接口使使用仅共享要使用的接口的类成为可能。当您需要在不同子系统之间交互时通常使用的接口。它还提供了松散耦合的好处,并隐藏了实际实现的对象 使用接口意味着接口的调用者不绑定到特定的实现 例如,如果您使用的是C,并且需要一个数据序列,那么您希望从IEnumerable的角度看到这一点。您不在乎实现是什么——并且需要一个特

为什么接口似乎与类完全相同,而只是函数声明。界面的主要好处是什么?除了多个类共享一个接口,但它仍然感觉像什么?每个类都有自己的实现,因此为什么要使用接口?

在静态类型的面向对象语言中,接口使使用仅共享要使用的接口的类成为可能。

当您需要在不同子系统之间交互时通常使用的接口。它还提供了松散耦合的好处,并隐藏了实际实现的对象

使用接口意味着接口的调用者不绑定到特定的实现

例如,如果您使用的是C,并且需要一个数据序列,那么您希望从
IEnumerable
的角度看到这一点。您不在乎实现是什么——并且需要一个特定的实现将限制代码的使用方式


另一个例子是
Stream
——它是一个抽象类而不是接口,但基本原理是相同的。您可以将任何类型的流解析为
XmlDocument
(以选择流的任意使用)。不管它是
文件流
网络流
内存流
还是其他任何东西,只要它支持所需的操作。

它允许两个完全不相关的类实现相同的接口,因此可以以相同的方式使用。(比如调用ISortable.Sort在两个列表上使用完全不同的实现。 这就像多重继承,只是更好。:)


接口也用于在进程之间共享对象(Google for COM或Automation)。

当使用接口进行设计时,需要强调预期的行为,而不会因任何实现无效的细节而造成污染

接口表示契约,允许应用程序的其余部分通过此接口使用遵守此契约的任何对象

简言之:

  • 设计清晰
  • 设计的灵活性
  • 接口(通常)提供抽象和封装

    抽象意味着客户端不需要知道比在接口中更多的信息就可以使用对象

    封装意味着客户端不能知道接口中的更多信息

    这些统称为信息隐藏

    因此,在某种程度上,您是对的,每个类都提供自己的实现,因此您不需要接口。但是,在这种情况下,客户端将依赖于实现。不幸的是,在现实世界中,实现一直在变化。随着实现的更改,所有依赖代码都必须更改

    通过使用接口,客户端只依赖于接口中指定的内容,而不依赖于实际实现。因此,实现可能会更改,而客户端代码可能不一定需要更改。当然,必须注意接口本身不会改变

    假设您有一个对象集合。然后需要按一定顺序对这些对象进行排序。如果将集合实现为树,则要排序的代码与实现链表的代码完全不同。如果这些实现的任何细节发生变化,则暴露于这些实现的客户机代码将需要更改

    另一方面,如果您创建了一个接口(比如Collection),该接口承诺任何实现都能够自行排序,但它没有告诉您如何排序,那么您的客户机代码可以依赖于排序能力,而不知道排序的细节

    您可以在不影响客户端代码的情况下愉快地更改集合类型和排序算法。

    了解接口用法

    我想每天投票一次:-)