2012-05-02 33 views
4

我有這樣的Java接口:如何使這個Java接口靈活

public class RedBox implements Box { 

    public void open() { 

    } 

    public void close() { 

    } 
} 

的問題是,我期待加入其他類:

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

該接口由該類擴展在未來還將實現Box界面。這些新的類將有自己的方法,例如其中一個類將有一個putInBox()方法,但是如果將putInBox()方法添加到Box接口,我還將被迫添加一個putInBox的空實現( )方法添加到之前實現Box界面的類中,如上面的RedBox類。

我加入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接口的每個以前的類中。

+0

爲什麼您需要將'putInBox()'添加到'Box'接口? – BalusC

+0

我想將putInBox()添加到Box接口,因爲我有另一個類,它調用實現Box接口的類的方法,通過獲取這些類的對象,例如:Caller c = new Caller(new RedBox()); – John

回答

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(); 
3

實現Box接口的新類只需要實現Box接口中的方法,而不需要實現Box接口的其他類中的任何其他方法。

2

正如上面所說的,有沒有必要在加入盒接口本身就是一個新類的新方法,你可以把它留在新的類中,這樣它就不會干擾任何其他的實現。

但是,如果你想擁有在接口級的新方法,一種方法來介紹一些靈活性,就是用你的界面,它提供的所有方法(空)實現的(摘要)基本實現:

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類。