4

我有这个 Java 接口:

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 接口,因为有一个类 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();

如何在新类中实现 Box 接口,而不会被迫将新方法的空实现添加到以前实现 Box 接口的每个类中。

4

3 回答 3

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);
}

现在您的盒子可以从适合您的设计的层次结构中实现接口。

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();
于 2012-05-02T22:01:41.220 回答
3

实现 Box 接口的新类只需要实现 Box 接口中的方法,而不需要实现 Box 接口的其他类中的任何其他方法。

于 2012-05-02T21:56:06.930 回答
2

如上所述,不需要在 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类。

于 2012-05-02T22:03:27.413 回答