如何使这个Java接口灵活

Joh*_*ohn 4 java interface class

我有这个Java接口:

public interface Box {
   public void open();
   public void close();
}
Run Code Online (Sandbox Code Playgroud)

此类接口由此类扩展:

public class RedBox implements Box {

   public void open() {

   }

   public void close() {

   }
}
Run Code Online (Sandbox Code Playgroud)

问题是我希望将来添加其他类也将实现Box接口.那些新类将有自己的方法,例如其中一个类将有一个putInBox()方法,但如果我将putInBox()方法添加到Box接口,我也将被迫添加一个putInBox的空实现( )实现Box接口的前一个类的方法,如上面的RedBox类.

我将putInBox()添加到Box接口,因为有一个类Caller,它接受一个实现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();
Run Code Online (Sandbox Code Playgroud)

如何在新类中实现Box接口,而不必强制将新方法的空实现添加到实现Box接口的每个先前类中.

das*_*ght 9

您不仅限于单一界面 - 您可以构建整个层次结构!例如,您可以创建以下三个接口:

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);
}
Run Code Online (Sandbox Code Playgroud)

现在,您的盒子可以从适合您设计的层次结构中实现一个界面.

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) {}
}
Run Code Online (Sandbox Code Playgroud)

使用层次结构,您可以继续编程到界面:

MutableBox mb = new BlueBox();
mb.putItem(123);
LockableBox lb = new RedBox();
lb.unlock();
Run Code Online (Sandbox Code Playgroud)