【问题标题】:situation where interface is better than abstract class [duplicate]接口优于抽象类的情况[重复]
【发布时间】:2011-02-27 14:44:19
【问题描述】:

请告诉我Java中接口比抽象类更好的情况

【问题讨论】:

    标签: java oop


    【解决方案1】:

    当您不需要提供任何默认实现时使用接口。

    这是一个比较两者的不错的链接:Interface vs. Abstract Class

    【讨论】:

      【解决方案2】:

      你只能有一个直接的抽象超类。因此,如果您需要公开两个或更多接口,则接口很有用。

      【讨论】:

        【解决方案3】:

        当您希望多个类实现该接口并且您不必继承默认行为时,接口比抽象类更好。

        【讨论】:

          【解决方案4】:
          • 一个类可以实现多个接口,但只能扩展一个抽象类。
          • 接口允许创建封装具体类的代理。框架广泛使用它来拦截对具体类的方法调用(例如,在方法执行之前启动事务或写入日志)。

          【讨论】:

            【解决方案5】:

            Java 没有多重继承;因此,您不能拥有一个同时实现两个抽象类的类。例如,如果你想要一个MouseListener 和一个ActionListener 在同一个类中,你必须使用接口方式。

            【讨论】:

              【解决方案6】:

              我想你误解了接口和抽象类的真正含义。

              接口是一种编程结构,您可以在其中定义要公开给公共或其他模块的功能/服务。一种合同,您承诺您将提供一些功能或服务,但隐藏了实现,以便可以在不影响您的合同的情况下更改实现。

              抽象类是一个部分实现的类,除了作为多个具有实际意义的子类的父类之外,它没有任何实际意义。抽象类是为多个子类提供默认功能的特殊父类。由于没有合适的具体父类,它被创建为抽象的。

              在一个好的设计中,您应该始终创建一个界面。但是抽象类是可选的。如果找不到具体的父类,请创建一个抽象类并实现接口,然后为这些接口函数(如果可能)提供默认实现,否则将它们标记为抽象函数并将实现留给子类。

              【讨论】:

              • 没错。问题不应该是“接口优于抽象类的情况”,而是“必须使用抽象类而不是接口的情况”。
              【解决方案7】:

              为了提供 WebServices 或进行 JMock 测试,您不需要实际的实现,您只需要一个接口定义。想一想,只要调用你的 API,就没有必要将实现返回给第三方。

              【讨论】:

                【解决方案8】:

                当您需要在任何类中实现时,因为接口可以在任何类或接口中实现,但抽象类不能这样做,例如在 Applet 中,Applet 类总是在我们的 Applet 应用程序中扩展,在这种情况下,我们不能扩展抽象类。

                【讨论】:

                  【解决方案9】:

                  抽象类:定义或声明一个更重要的方法。例子: 车辆必须有外形和发动机。所以我们把这个行为放在抽象类中。

                  abstract class Vehicle {
                    abstract void shape();
                    abstract void engine();
                  }
                  

                  接口类:除了属性,如移动、喇叭等。因此,接口可以为您的具体类提供额外的行为。

                  interface Honk{
                  void honk();
                  }
                  interface moveable{
                  void move();
                  }
                  
                  class Car extends Vehicle implements Moveable {
                    @Override
                    void shape() {
                      System.out.println("car's shape");
                    }
                    @Override
                    void Engine() {
                      System.out.println("car's engine");
                    }
                   @Override
                    void move() {
                      System.out.println("car's can move");
                    }
                  }
                  

                  但我没有实现鸣喇叭行为。如果你愿意,你可以实现多个接口。

                  【讨论】:

                    猜你喜欢
                    • 2011-07-12
                    • 1970-01-01
                    • 2010-10-12
                    • 2012-05-23
                    • 2011-12-05
                    • 2011-07-02
                    • 2017-11-13
                    • 1970-01-01
                    • 2011-09-21
                    相关资源
                    最近更新 更多