2015-05-12 32 views
1

我需要在我的項目中實現Observers的各種update方法,以便使用特定類型重載Object參數。因此,不是使用Java中的接口內部重載

public void update (Observable o, Object arg0){ 
    if(arg0 instanceof Class1) .... 
    else if (arg0 instanceof Class2) .... 

或開關(它是工作的一個非常「C」的方式),我想使用interface延伸Observer和重載update方法,像這樣

public interface ExtendedObserver extends Observer{ 
    public void update (Observable obj, Class1 cls); 
    public void update (Observable obj, Class2 cls); 
} 

然後將其實施到我的觀察員。每個不同的觀察者都將使用特定的更新方法。

我想知道這是否是工作的正確方式,因爲

  1. 我不認爲超載的接口內的方法是正確的
  2. 我還是要添加未使用更新方法在實現接口的每個類中。
+1

如果您使用的是Java 8,則可以爲所有方法提供空的默認實現,因此您不必在實現者中重新定義所有這些方法。順便說一句,很高興知道你想要在這些if-instanceof分支中做什麼。可能最好將此功能移到Class1和Class2上? –

回答

1
  • 有超載內部接口
  • 接口的方法沒有問題,是一個合同是強制性的實現類 來實現。如果你不想讓類實現這個方法。 有沒有必要將它包含在接口中。
  • 所以你可以在那些只在需要的地方寫這個重載的方法。或者讓抽象類實現接口並在其中寫入重載方法。
  • 這樣你就不會結束暴露不必要的方法合同,其他類
1

你可以嘗試改變接口一個抽象類並實現兩種方法存在的。另外,請考慮使用泛型。

1

如果你控制Class1Class2,倒不如改變他們是這樣的:

interface Updatable { 
    void doUpdate(Observable obj); 
} 

class Class1 implements Updatable { 
    ... 
    void doUpdate(Observable obj) { /*class1-specific code*/ } 
} 

class Class2 implements Updatable { 
    ... 
    void doUpdate(Observable obj) { /*class2-specific code*/ } 
} 

這樣,你的主要更新方法是這樣的:

public void update (Observable o, Updatable arg0){ 
    arg0.doUpdate(o); 
} 
1

我不認爲這是實現接口的正確方式。接口是一個類的特定特徵(Scala)。所以如果只有一個參數類型正在改變,我會推薦使用bounded Type Parameters

public interface ExtendedObserver<T> extends Observer{ 
    public void update (Observable obj, T cls); 
} 

如果這對你沒有幫助,我會建議你在他們自己的界面中外包特定於類的方法。