4

私はこのJavaインターフェイスを持っています:

public interface Box {
   public void open();
   public void close();
}

このインターフェースは、このクラスによって拡張されます。

public class RedBox implements Box {

   public void open() {

   }

   public void close() {

   }
}

問題は、将来、BoxInterfaceも実装する他のクラスを追加しようとしていることです。これらの新しいクラスには独自のメソッドがあります。たとえば、クラスの1つにはputInBox()メソッドがありますが、putInBox()メソッドをBoxインターフェイスに追加すると、putInBox(の空の実装も追加する必要があります。 )上記のRedBoxクラスのようなBoxインターフェイスを実装した以前のクラスへのメソッド。

Boxインターフェイスを実装したクラスのオブジェクトを受け取るクラスCallerがあるため、ボックスインターフェイスにputInBox()を追加しています。例:

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 Interfaceを実装した以前の各クラスに新しいメソッドの空の実装を追加することを強制されることなく、新しいクラスにBoxInterfaceを実装するにはどうすればよいですか。

4

3 に答える 3

9

単一のインターフェースに限定されることはありません-階層全体を構築することができます!たとえば、次の3つのインターフェイスを作成できます。

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 に答える