将接口与Java实现分离

将接口与Java实现分离,java,Java,如何将接口与Java实现分离 在C/C++中,这可以通过创建两个文件来完成,一个是具有相同文件名的.C文件,另一个是.h文件。 如何在Java中实现这一点?方法是创建一个接口,并(通常)在两个文件中实现它- Say.java接口- public interface Say { public void say(String msg); } 和Hello.java,具体实现(在本例中也是如此)也是main()方法- public class Hello implements Say { @

如何将接口与Java实现分离

在C/C++中,这可以通过创建两个文件来完成,一个是具有相同文件名的.C文件,另一个是.h文件。
如何在Java中实现这一点?

方法是创建一个
接口,并(通常)在两个文件中实现它-

Say.java
接口-

public interface Say {
  public void say(String msg);
}
Hello.java
,具体实现(在本例中也是如此)也是
main()
方法-

public class Hello implements Say {
  @Override
  public void say(String msg) {
    System.out.printf("%s, World!%n", msg);
  }
  public static void main(String[] args) {
    Say s = new Hello();
    s.say("Hello");
  }
}

注意:在Java中,可以使用
main()
方法创建多个类。使用
@Override
注释也是一种很好的做法。

您不需要。您可以通过Java接口来实现,但对每个类都这样做将是糟糕的设计。仅当您希望多个类实现接口时,或者当接口用作回调函数描述时,才应使用接口。实际上,C++中的代码与.h文件的分离点是

1) 为了防止二进制文件膨胀,编译器将为其包含的每个文件制作每个函数的多个版本

2) 让那些只想要实现的人更容易阅读

在java中,1不是问题。Java更喜欢通过自动化文档工具(JavaDoc)解决2


TLDR—您没有。

与.h和.c分离最接近的类比是接口

MyInterface.java

interface MyInterface {

    void doSomething();

}
class MyImplementation implements MyInterface {

    public void doSomething() {
        System.out.println("Hello world");
    }

}
MyImplementation.java

interface MyInterface {

    void doSomething();

}
class MyImplementation implements MyInterface {

    public void doSomething() {
        System.out.println("Hello world");
    }

}
然后,除了实际的构造函数之外,您可以在任何地方使用接口类型

MyInterface instance = new MyImplementation();
当然,有几个不同之处

  • 一个类可以实现多个接口,多个类可以实现一个接口
  • 接口中不包括成员值,仅包括方法
  • Java接口中只显示公共方法
  • 接口中不允许执行任何(与依赖于.h实现的C++模板相反)。
但这就是“接口编程”的实现方式



在Java中,接口和具体类的命名没有一致的约定。C#(在处理接口方面几乎相同)有一个约定,我在接口以
I
开头时使用它,例如
IList
。Java标准库倾向于使用接口的“纯”名称,然后根据具体实现对其进行修改,例如
List
(接口)和
ArrayList
(实现)。

要将接口和实现分开,建议以下步骤

(1).确定属于类定义一部分的方法。这将成为具有类似功能的新类的模板

(二)。创建一个新接口,其中包含被标识为接口定义一部分的方法(可能是多个接口)


(3.)修改类以实现您在Java中创建的接口,接口和类(即“实现”)在文件级别或名称上不可区分。它们都是声明。具体来说,类声明它实现的接口。例如:

public class MyClass implements Interface1, Interface2, .... {
    // implementations
}

Java没有与C/C++中相同的“链接”概念。您可以以任何合法形式调用类或接口。运行时接口与其实现类之间的“链接”是通过类加载器完成的

您可能正在寻找Java接口。但是它们并不完全相同。我需要创建两个具有相同文件名的.java文件吗?一个有接口,另一个有实现定义?“接口只应在您期望多个类实现它们时使用”只是为了澄清:在许多Java库中,接口只有一个实现。然而,在这些情况下,采用不同的实施方式是合理的。“你不喜欢”可能太强烈了。我会坚持你不喜欢。在您真正编写第二个实现之前,这是徒劳的。当你真正开始的时候,你几乎总是会把界面变得更好。在至少有两个实现之前,我不会中断一个接口。回调接口是个例外,进行回调的类需要这个定义。那么,java程序中的某些类没有接口是正常的吗?绝大多数都没有。接口用于回调和多个实现的行为。例如,List,其中包含用于不同实现的ArrayList和LinkedList。