2014-01-11 116 views
0

這是一個複雜的問題來解釋,所以我做了一個蹩腳的MSPaint diagram迭代一個類的方法迭代一個子類

enter image description here

說我有子類對象的列表。其中一些包含一種稱爲onEvent();的方法。在我的onEvent();裏面,我從一個完全不相關的類裏面遍歷我的對象列表,如果它們存在,就調用它們的onEvent();。顯然,如果我嘗試迭代類型超類的列表,它必須是一個抽象的方法來工作。我只想要一些特定的子類擁有這個onEvent()方法。

我可能已經很難理解,但我希望你能得到它,任何想法將不勝感激。

+0

所有的子類都會有onEvent()方法,您不能阻止繼承。如果onEvent()不是私有/靜態的。 **顯然,如果我嘗試迭代類型超類的列表,它必須是一個抽象的方法來工作**沒有得到這一行? –

回答

0

我認爲你應該重新考慮你的班級設計。

有兩種解決方案,您的問題

  1. onEvent方法成你的超類非抽象方法與空體。然後,只能在適當的情況下在子類中覆蓋。

  2. 介紹一個接口 - 我們稱之爲EventHandler - 聲明方法onEvent。在適當的地方在你的子類中實現這個接口。然後,將列表更改爲EventHandler對象的列表,或保持原樣,並使用instanceof檢查迭代中的對象是否爲EventHandler

0

在超:

// subclasses should override this if they want onEvent to be supported 
public boolean isOnEventSupported() { 
    return false; 
} 

public final void onEvent() { 
    if (!isOnEventSupported()) { 
     throw new UnsupportedOperationException("onEvent is not supported"); 
    } 
    doOnEvent(); 
} 

protected void doOnEvent() { 
    // do nothing : subclasses should override this if they want onEvent to do something useful 
} 
+0

也可能的答案:) –

+0

我認爲在大多數情況下,如果方法不受支持(例如,當您只需遍歷列表並調用onEvent),則拋出異常是不利的。所以在大多數情況下,一個簡單的空方法體應該是適當的並且不那麼複雜。 – isnot2bad

+0

如果onEvent返回void,那麼默認情況下的確可以不做任何事情。如果它應該返回非空的東西,那麼它可能是不可能的。在這種情況下,使用isOnEventSupported()方法可以檢查在實際調用之前是否可以調用該方法。 –

0

很簡單:

interface Listener { 
    void onEvent(); 
} 

public class SuperClass {} 

public class SubClass1 extends SuperClass implements Listener { 
    public void onEvent(); 
} 

public class SubClass2 extends SuperClass {} 

public class DifferentClass implements Listener { 
    private final List<SuperClass> objects; 

    public void onEvent() { 
     for (SuperClass o : objects) { 
      if (o instanceof Listener) { 
       ((Listener)o).onEvent(); 
      } 
     } 
    } 
} 

至於我的設計是一個有點混亂。我不知道你的具體情況,但使用instanceof通常是不好的設計氣味!

0

最簡單的解決方案是在超類中製作onEvent抽象。然後在不支持它的子類上用空主體覆蓋它。