Interface和Abstract类共享相同的方法

时间:2016-08-24 18:16:10

标签: java interface abstract-class

这个设计真的有效吗? 传统的应用程序代码,如果没有必要,只需尝试重构。

Array.count

我可以摆脱public interface Interface { public void abc(); } public abstract class abClass implements Interface{ @Override public void abc(){ throw new UnsupportedOpException(NOT_IMPLEMENTED_MSG); } public class xyz extends abClass{ @Override public void abc(){ .......//some code here } 吗?不确定这个设计背后的初衷是什么。您希望何时在Interfacesame methods类中获得interface,最终获得abstract

3 个答案:

答案 0 :(得分:0)

void abc();必须由抽象类或继承的类实现...

没有机会摆脱......

如果您愿意,可以移动void abc();作为Abstract类的一种方法......

重新定义它并且:

  • 通过最终确定来阻止覆盖。

  • 将实现的责任委托给子类,通过使它抽象化......

答案 1 :(得分:0)

我认为,从功能编程的角度来看,它很好。拥有implements Interface只意味着类必须拥有具有相同名称的方法。它在abClass中定义的事实意味着您不仅要说从abClass继承的所有类都必须具有接口,而且您不需要在每个类中重新定义它class,除非你想覆盖。

所以你实际上并没有在Interface中定义方法,而是在abClass中进行定义,当你在xyz中定义方法时,你会覆盖abClass中的方法。

答案 2 :(得分:0)

当抽象类提供您需要的东西并且抽象类无法提供时,它应该在抽象类后面使用 创建一个接口没有具体原因,但是因为你认为interface==OOP会带来开销并证明你误解了OOP是什么。

在您的情况下,如果在应用程序代码中,您注意到您可以删除抽象类后面的接口并且您在编译时没有真正的影响,您可能想知道接口的抽象是否不只是一个开销。它可能是有用的,因为没用。我会发展它。

使用抽象类后面的接口可以打开实现的可能性:您可以从与接口相关的这个抽象类中受益,但是您也可以在具体类中实现接口,而不会受益于抽象类,因此您可以随意使用。从A到Z编写实现可能适合根据我们的需要而不适合。

就我个人而言,我认为在两种情况下,接口在抽象类后面很有用:

  • 该界面适用于所有类型的目标具体类,但是 抽象类不适用于所有类型的目标具体类。

例如,当您实现装饰器时,您有一个通用接口来表示装饰类和装饰器类。
装饰器类具有来自装饰类的不同逻辑和数据。因此,我们的装饰类或装饰类的抽象类可能不同。

这是一个用于为文档表示装饰器的简单示例。

通用界面:

public interface IDocumentInput {

    void read();

    byte[] getBytes();

    String getStringContent();

}

装饰文件:

public class DocumentInput implements IDocumentInput {

    private byte[] bytes;

    public DocumentInput(byte[] bytes) {
      this.bytes = bytes;
    }

    public byte[] getBytes() {
      return bytes;
    }

    public void read() {
    }

    public String getStringContent() {
      return new String(getBytes(),StandardCharsets.UTF_8);
    }

}

装饰器的抽象类:

public abstract class AbstractDocumentInputDecorator implements IDocumentInput {

    protected IDocumentInput document;
    protected byte[] bytes;

    public AbstractDocumentInputDecorator(IDocumentInput document) {
      this.document = document;
    }

    public byte[] getBytes() {
      return bytes;
    }

    public final String getStringContent() {
      return new String(getBytes(),StandardCharsets.UTF_8);
    }
}

混凝土装饰:

public class SecuredDocumentInputDecorator extends AbstractDocumentInputDecorator {

    public SecuredDocumentInputDecorator(IDocumentInput document) {
      super(document);
    }

    @Override
    public void read() {
      document.read();
      processUnsecuring();
    }

    private void processUnsecuring() {
      byte[] originalBytes = document.getBytes();
      bytes = Base64.decodeBase64(originalBytes);
    }

}

在这种情况下,引入接口似乎是合乎逻辑的,因为抽象类不足以表示所有具体类的常见行为和/或数据。

  • 您希望为开发人员提供创建自己的接口实现的可能性,无论是否依赖抽象类实现。通常,在创建开放API时,这是合乎需要的。 JDK课程中的集合很好地说明了这一点 实际上,如果你想创建促进可扩展性的接口/契约,当你只提供一个抽象类时,想要创建它们的实现的开发人员被迫使用抽象类,即使他们不想要。这是不可取的。

  • 您使用的库会强制您使用接口。例如,在这些第一版中使用EJB 3.0和Spring,使用抽象类或类不允许从其某些功能中受益。