如何使这个Java接口灵活
我有这个Java接口:如何使这个Java接口灵活,java,class,interface,Java,Class,Interface,我有这个Java接口: public interface Box { public void open(); public void close(); } 此接口由此类扩展: public class RedBox implements Box { public void open() { } public void close() { } } 问题是,我希望将来添加其他类,这些类也将实现Box接口。这些新类将有自己的方法,例如其中一个类将有一个p
public interface Box {
public void open();
public void close();
}
此接口由此类扩展:
public class RedBox implements Box {
public void open() {
}
public void close() {
}
}
问题是,我希望将来添加其他类,这些类也将实现Box接口。这些新类将有自己的方法,例如其中一个类将有一个putInBox()方法,但是如果我将putInBox()方法添加到Box接口,我还将被迫将putInBox()方法的空实现添加到实现Box接口的以前类中,如上面的RedBox类
我将putInBox()添加到Box接口,因为有一个类调用程序接受实现Box接口的类的对象,例如:
public class Caller {
private Box box;
private int command;
public Caller(Box b) {
this.box = b;
}
public void setCommandID(int id) {
this.command = id;
}
public void call() {
if(command == 1) {
box.open();
}
if(command == 2) {
box.close();
}
// more commands here...
}
}
Caller c = new Caller(new RedBox());
c.call();
如何在新类中实现Box接口,而不必将新方法的空实现添加到以前实现Box接口的每个类中。实现Box接口的新类只需要实现Box接口中的方法,其他类中没有实现Box接口的任何其他方法。您不限于一个接口-您可以构建整个层次结构!例如,您可以创建以下三个接口:
public interface Box {
public void open();
public void close();
}
public interface LockableBox extends Box {
public void lock();
public void unlock();
}
public interface MutableBox extends Box {
public void putItem(int item);
public void removeItem(int item);
}
现在,您的盒子可以实现层次结构中适合您设计的接口
public class RedBox implements LockableBox {
public void open() {}
public void close() {}
public void lock() {}
public void unlock() {}
}
public class BlueBox implements MutableBox {
public void open() {}
public void close() {}
public void putItem(int item) {}
public void removeItem(int item) {}
}
有了层次结构,您可以继续对接口进行编程:
MutableBox mb = new BlueBox();
mb.putItem(123);
LockableBox lb = new RedBox();
lb.unlock();
如上所述,没有必要将新类中的新方法添加到Box接口本身,您可以将其保留在该新类中,因此它不会干扰任何其他实现 但是,如果您确实希望在接口级别使用新方法,引入一些灵活性的方法是使用接口的(抽象)基本实现,该实现提供所有方法的(空)实现:
public abstract class BoxBase implements Box {
public void open() { }
public void close() { }
}
public class RedBox extends BoxBase {
@Override
public void open() {
// open a red box
}
}
这样,在向Box接口添加新方法时,您只需将该方法的实现添加到
BoxBase
类,它不会干扰您的RedBox
类。为什么您需要将putInBox()
添加到Box
接口?我想添加putInBox()因为我有另一个类调用实现Box接口的类上的方法,该类通过获取这些类的对象来实现Box接口,例如:Caller c=newcaller(new RedBox());