簡體   English   中英

如何使這個Java接口靈活

[英]How to make this Java Interface flexible

我有這個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接口的每個先前類中。

您不僅限於單一界面 - 您可以構建整個層次結構! 例如,您可以創建以下三個接口:

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接口的新類只需要實現Box接口中的方法,而不是實現Box接口的其他類中的任何其他方法。

如上所述,沒有必要在添加到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類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM