编码到接口?

Ari*_*Ari 17 java oop

我想巩固我对"编码到界面"概念的理解.据我所知,一个人创建界面来描述预期的功能,然后在具体的类中实现这些"契约".要使用接口,可以简单地在具体类的实例上调用方法.

显而易见的好处是了解具体类提供的功能,而不管其具体实现如何.

基于以上内容:

  1. 我对"编码到接口"的理解是否有任何谬误?
  2. 编码到我错过的接口有什么好处吗?

谢谢.

duf*_*ymo 16

只有一个可能的纠正:

要使用接口,可以简单地在具体类的实例上调用方法.

可以在类型接口的引用上调用方法,这恰好使用具体类作为实现:

List<String> l = new ArrayList<String>();
l.add("foo");
l.add("bar");
Run Code Online (Sandbox Code Playgroud)

如果您决定切换到另一个List实现,则客户端代码无需更改即可运行:

List<String> l = new LinkedList<String>();
Run Code Online (Sandbox Code Playgroud)

这对隐藏实现细节,自动生成代理等特别有用.

你会发现像这样的框架鼓励对界面进行编程.它是编程,自动生成的事务管理代理等思想的基础.


Pau*_*sey 5

主要优点是使用接口将类与其依赖项松散地耦合在一起。然后,您可以更改一个类,或实现一个新的具体接口实现,而无需更改依赖于它的类。


Jon*_*onH 5

你的理解似乎正确.你的同事只是摆在你的办公桌旁,并把你喝醉了的老板主演的圣诞派对的所有最新照片装到他的拇指驱动器上.你的同事和你没有想过这个拇指驱动器是如何工作的,对你来说它是一个黑盒子,但你知道它因USB接口而起作用.

无论是SanDisk还是Titanium(甚至不确定是一个品牌)都没关系,尺寸/颜色也无关紧要.事实上,唯一重要的是它没有被破坏(可读)并且它插入USB.

你的USB拇指驱动器遵守合同,它本质上是一个接口.人们可以认为它履行了一些非常基本的职责:

  1. 插入USB
  2. 遵守合同方法CopyDataTo:

    public Interface IUSB {void CopyDataTo(string somePath); //用于将数据从缩略图驱动器复制到...}

  3. 遵守合同方法CopyDataFrom:

    public Interface IUSB {void CopyDataFrom(); //用于将数据从PC复制到缩略图驱动器}

好吧,也许不是那些方法,但IUSB接口只是缩略图驱动器供应商必须遵守的合同,以确保跨各种平台/供应商的功能.所以SanDisk通过界面制作了他们的拇指驱动器:

public class SanDiskUSB : IUSB
 {
  //todo: define methods of the interface here
 }
Run Code Online (Sandbox Code Playgroud)

Ari,我认为你已经对接口的工作方式有了深刻的理解(听起来是什么样的).