我是编程新手,我正在学习Java。 我只是想知道为什么我应该在只有一个实现类时使用接口?
答案 0 :(得分:7)
您这样做是为了防止其他人访问您的实施类型。例如,您可以在库中隐藏实现类型,提供类型包访问权限,并将接口实例返回给库的用户:
// This is what the users of your library know about the class
// that does the work:
public interface SomeInterface {
void doSomethingUseful();
void doSomethingElse();
}
// This is the class itself, which is hidden from your clients
class MyImplementation implements SomeInterface {
private SomeDependency dependency = new SomeDependency();
public void doSomethingUseful() {
...
}
public void doSomethingElse() {
...
}
}
您的客户获得以下对象:
public class MyFactory {
static SomeInterface make() {
// MyFactory can see MyImplementation
return new MyImplementation();
}
}
当实现使用大量库时,这个技巧变得有用。您可以有效地将库的接口与其实现分离,这样用户就不必了解库内部的依赖项。
答案 1 :(得分:0)
一个原因是维持开放/封闭原则,该原则规定您的代码应该是可以扩展的,但是关闭以进行修改。虽然你现在只有一个实现类,但是随着时间的推移,你可能需要另一个不同的实现类。如果事先将实现提取到接口中,则只需编写另一个实现类即。您无需修改完美的代码,从而消除了引入错误的风险。
答案 2 :(得分:0)
它可以让您灵活地在将来添加更多实现,而无需更改引用该接口的客户端代码。
另一个有用的例子是在需要时在Java中模拟多重继承。例如,假设您有一个接口MyInterface
和一个实现:
public interface MyInterface {
void aMethod1();
void aMethod2();
}
class MyInterfaceImpl implements MyInterface {
public void aMethod1() {...}
public void aMethod2() {...}
}
您还有一个与其自己的层次结构无关的类:
public class SomeClass extends SomeOtherClass {
...
}
现在,您希望SomeClass
的类型为MyInterface
,但您还希望继承MyInterfaceImpl
中已存在的所有代码。由于您无法扩展SomeOtherClass
和MyInterfaceImpl
,因此您可以实现接口并使用委托:
public class SomeClass extends SomeOtherClass implements MyInterface {
private MyInterface myInterface = new MyInterfaceImpl();
public void aMethod1() {
myInterface.aMethod1();
}
public void aMethod2() {
myInterface.aMethod2();
}
...
}
答案 3 :(得分:0)
尊重接口隔离原则。
创建接口的决定不应该基于实现类的数量,而应该基于使用对象的不同方式的数量。使用对象的每种方式都由接口表示,接口由使用它的代码定义。假设您的对象需要存储在内存中,保存在按顺序保存对象的集合中。同一个对象也需要存储在一些持久存储中。
假设您首先实现持久性。存储系统需要的是持久对象的唯一标识符。使用方法getUniqueId创建一个接口,比如Storable。然后,您实现存储。
然后,您实现该集合。您可以使用方法compareTo从接口中的存储对象(如Comparable)定义集合所需的内容。然后,您可以依赖Comparable实现集合。
您要定义的类将实现两个接口。
如果您要定义的类实现单个接口,则该接口必须表示集合和存储系统的需求。这将导致,例如:
集合的单元测试必须使用实现Storable的对象编写,增加了复杂程度。
如果以后需要显示对象,则必须将显示代码所需的方法添加到单个界面,并修改测试以进行收集和存储,以实现显示所需的方法。
我在这里讨论对测试代码的影响。如果其他生产级别对象需要存储而不显示,则问题会更大。项目越大,不遵守接口隔离原则所产生的问题就越大。
答案 4 :(得分:-5)
接口可以由多个类实现。没有规则只有一个类可以实现这些。接口为java提供抽象。
http://www.tutorialspoint.com/java/java_interfaces.htm 您可以从此链接获取有关接口的更多信息