首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使Java接口变得灵活

如何使Java接口变得灵活
EN

Stack Overflow用户
提问于 2012-05-03 05:51:54
回答 3查看 1.4K关注 0票数 4

我有这个Java接口:

代码语言:javascript
复制
public interface Box {
   public void open();
   public void close();
}

这个接口由这个类扩展:

代码语言:javascript
复制
public class RedBox implements Box {

   public void open() {

   }

   public void close() {

   }
}

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

我将putInBox()添加到盒子接口,因为有一个类调用者接受实现盒子接口的类的对象,例如:

代码语言:javascript
复制
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接口的每个类添加新方法的空实现。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-03 06:01:41

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

代码语言:javascript
复制
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);
}

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

代码语言:javascript
复制
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) {}
}

有了层次结构后,您可以继续对接口进行编程:

代码语言:javascript
复制
MutableBox mb = new BlueBox();
mb.putItem(123);
LockableBox lb = new RedBox();
lb.unlock();
票数 9
EN

Stack Overflow用户

发布于 2012-05-03 05:56:07

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

票数 3
EN

Stack Overflow用户

发布于 2012-05-03 06:03:27

如上所述,不需要将新类中的新方法添加到Box接口本身,您只需将其保留在新类中,因此它不会干扰任何其他实现。

但是,如果您确实希望在接口层使用新方法,一种引入灵活性的方法是使用接口的(抽象)基本实现,该实现提供所有方法的(空)实现:

代码语言:javascript
复制
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类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10422243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档