如何将接口与Java中的实现分离?
在C/c++中,这可以通过创建两个文件名相同的文件来完成。C和。h文件。在Java中如何做到这一点呢?
与。h和。c的分离最接近的类比是接口。
MyInterface.java
interface MyInterface {
void doSomething();
}
MyImplementation.java
class MyImplementation implements MyInterface {
public void doSomething() {
System.out.println("Hello world");
}
}
然后除了实际的构造函数
之外,在所有地方都使用接口类型MyInterface instance = new MyImplementation();
当然,有几个不同之处。
- 一个类可以实现多个接口,多个类可以实现一个接口
- 接口中不包含成员值,只包含方法。
- Java接口中只出现公共方法。
- 接口中不允许有任何实现(与c++模板相反,c++模板依赖于.h实现)。
但这就是"面向接口编程"的实现方式。
在Java中,接口和具体类的命名没有一致的约定。c#(在接口的处理上几乎相同)有一个约定,我在接口以I
开头的地方使用了这个约定,例如IList
。Java标准库倾向于为接口使用"纯"名称,然后为具体实现修改它,例如List
(接口)和ArrayList
(实现)。
通过创建interface
,并(通常)在两个文件中实现它-
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。
在Java中,接口和类(即"实现")在文件级别或名称上是不能区分的。它们都是声明。具体来说,一个类声明它实现了哪个接口。例如:
public class MyClass implements Interface1, Interface2, .... {
// implementations
}
Java没有与C/c++相同的"链接"概念。您可以以任何合法形式调用类或接口。在运行时,接口和它的实现类之间的"链接"是通过类加载器完成的。
要将接口和实现分开,建议采用以下步骤:
(1).识别属于类定义一部分的方法。这将成为具有类似功能的新类的模板。
(2)。创建一个新接口,其中包含被标识为接口定义(可能是许多接口)一部分的方法
(3)。修改您的类以实现您创建的接口