【问题标题】:What is the advantage of using interfaces [duplicate]使用接口有什么好处[重复]
【发布时间】:2013-07-16 20:07:35
【问题描述】:

假设你有一个接口

public interface Change {

    void updateUser();
    void deleteUser();
    void helpUser();

}

我读过接口是 Java 实现多重继承的方式。你实现一个接口,然后你就可以访问它的方法。我不明白的是,这些方法在接口中没有任何主体,所以你需要在你的类中给它们一个主体。因此,如果您的接口由多个类实现,则需要在多个类中为该方法提供一个主体。为什么这比只在类中使用单独的方法而不实现接口更好?

【问题讨论】:

  • 当你开始设计一个库和它的 API 伙伴时,你会发现接口很有用:)
  • 一点点谷歌搜索会带你找到很多答案。 Read the comment of Michael Borgwardt 但无论如何.. 我和你有同样的问题,我个人看不到接口的真正好处..
  • @arshajii:同意,我撤回了接近投票。
  • 在许多情况下会更好,因为每个实现都可能完全不同。我喜欢this answer 的表达方式。使用接口比在多个类中实现一个方法强大得多,因为如果每个类都实现相同的接口,您可以将它们都视为相同(无需强制转换)。这是another answer,它展示了您可以利用接口的一些方法。

标签: java interface


【解决方案1】:

我的大学教授曾经讲过一个很好的轶事来描述多态性和封装性。事情是这样的。


这里有人知道汽水机的工作原理吗? (暗示我们为什么要谈论这个困惑的目光。)不?让我告诉你。

你把零钱放进去,机器里面有一只小猴子,它会清点你所有的零钱,以确保你投入了足够的钱。当你按下你的汽水按钮时,一个小灯会亮起,告诉猴子你按下了哪个按钮,如果你输入了正确的零钱,它就会抓住你的选择,把它扔进小洞里,让你拿​​你的汽水。

这就是封装的概念。我们隐藏了汽水机的实现。除非它有一个花哨的、透明的窗户让你看到里面,否则你真的不知道它是如何工作的。您所知道的就是您投入一些现金,然后按下一个按钮,如果投入足够,您就会得到饮料。

另外,你知道如何使用汽水机的界面,所以只要机器的界面遵循普通汽水机的界面,你就可以使用它。这称为接口契约。这台机器可以将来自南极洲的饮料放在传送带上,让您随心所欲,只要您拿到饮料,它是冷的,您可以找零钱回来。

多态是指当您使用汽水机界面时,它可能会做不同的事情。这就是封装和多态密切相关的原因。在多态性中,您所知道的只是您使用的是SodaMachine 实现,它可以更改,因此可以在幕后完成不同的事情。这导致了多态性的驱动概念,即一个对象 SodaMachine 能够同时充当 MonkeySodaMachineConveyorSodaMachine,具体取决于接口背后的实际机器。


可能不是逐字逐句,但足够接近。本质上它归结为两个概念:polymorphismencapsulation。如果您需要澄清,请告诉我。

【讨论】:

  • 非常好的类比。界面让您做的一件强大的事情是订购一辆装满不同工作方式的汽水机并将它们都放在同一个列表中。
  • 如果 xMonkey.java 、 yMonkey.java 等每种不同类型的饮料有不止一只猴子,这可能是一个更好的类比。
  • 我觉得这个汽水机的例子和抽象更相关。 IMO idk
  • @CharithaGoonewardena 抽象、多态性和封装在实际意义上是联系在一起的。如果把一个实现封装,再加一层抽象,就可以实现多态。换句话说,没有封装就没有抽象,没有抽象就没有多态。添加抽象层是实现多态性的原因。
  • @Brian。知道了。感谢您提供信息。
【解决方案2】:

它将调用者的期望与实现分开。你有一组纯粹的方法,你可以在没有任何实现知识的情况下调用。事实上,有些库如 JMS 和 JDBC 提供了没有任何实现的接口。

这种分离意味着您不需要知道任何实际实现的类。

【讨论】:

  • 为什么在这里投反对票?
【解决方案3】:

接口允许您保证某些方法存在并返回所需的类型。当编译器知道这一点时,它可以使用该假设来处理未知类,就好像它们具有某些已知行为一样。例如,可比较接口保证实现类将能够 compareTo() 一些类似的对象并返回一个 int。

这意味着您可以比较实现此接口的任何内容 - 因此您可以对任何可比较的内容进行排序,而不是编写一个方法来排序字符串,另一个方法来排序整数,另一个方法来排序 LabelledBoxesOfBooks

【讨论】:

    【解决方案4】:

    为什么这比在你的类中只使用单独的方法而不实现接口更好?

    因为如果一个类C 实现了一个接口I,那么只要需要I,就可以使用C。如果您不实现接口,则无法执行此操作(即使您提供了接口要求的所有适当方法):

    interface I {
        void foo();
    }
    
    class C1 implements I {
        public void foo() {
            System.out.println("C1");
        }
    }
    
    class C2 {  // C2 has a 'foo' method, but does not implement I
        public void foo() {
            System.out.println("C2");
        }
    }
    
    ...
    
    class Test {
        public static void main(String[] args) {
            I eye1 = new C1();  // works
            I eye2 = new C2();  // error!
        }
    }
    

    【讨论】:

    • 我有一个疑问,C2 myC2 = new C2; myC2.foo();会正常工作。那么使用interface有什么区别或者好处呢?
    【解决方案5】:

    接口本质上保证所有继承它的方法都有自己的方法,这样你就可以安全地调用接口中的任何继承它的方法。

    【讨论】:

      【解决方案6】:

      使用接口定义 API 变得更容易,因此接口的所有具体实现都在每个类中提供预期的方法。

      它还提供了一种实现多重继承的方法,这在 Java 中是不可能的(在 Java 中)使用直接的类继承。

      【讨论】:

        猜你喜欢
        • 2018-02-14
        • 1970-01-01
        • 2019-11-13
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        • 2016-08-15
        • 2013-08-18
        • 2017-03-27
        相关资源
        最近更新 更多