這是一個複雜的問題來解釋,所以我做了一個蹩腳的MSPaint diagram。迭代一個類的方法迭代一個子類
說我有子類對象的列表。其中一些包含一種稱爲onEvent();
的方法。在我的onEvent();
裏面,我從一個完全不相關的類裏面遍歷我的對象列表,如果它們存在,就調用它們的onEvent();
。顯然,如果我嘗試迭代類型超類的列表,它必須是一個抽象的方法來工作。我只想要一些特定的子類擁有這個onEvent()方法。
我可能已經很難理解,但我希望你能得到它,任何想法將不勝感激。
這是一個複雜的問題來解釋,所以我做了一個蹩腳的MSPaint diagram。迭代一個類的方法迭代一個子類
說我有子類對象的列表。其中一些包含一種稱爲onEvent();
的方法。在我的onEvent();
裏面,我從一個完全不相關的類裏面遍歷我的對象列表,如果它們存在,就調用它們的onEvent();
。顯然,如果我嘗試迭代類型超類的列表,它必須是一個抽象的方法來工作。我只想要一些特定的子類擁有這個onEvent()方法。
我可能已經很難理解,但我希望你能得到它,任何想法將不勝感激。
我認爲你應該重新考慮你的班級設計。
有兩種解決方案,您的問題
拉onEvent
方法成你的超類非抽象方法與空體。然後,只能在適當的情況下在子類中覆蓋。
介紹一個接口 - 我們稱之爲EventHandler
- 聲明方法onEvent
。在適當的地方在你的子類中實現這個接口。然後,將列表更改爲EventHandler
對象的列表,或保持原樣,並使用instanceof
檢查迭代中的對象是否爲EventHandler
。
在超:
// 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
}
也可能的答案:) –
我認爲在大多數情況下,如果方法不受支持(例如,當您只需遍歷列表並調用onEvent),則拋出異常是不利的。所以在大多數情況下,一個簡單的空方法體應該是適當的並且不那麼複雜。 – isnot2bad
如果onEvent返回void,那麼默認情況下的確可以不做任何事情。如果它應該返回非空的東西,那麼它可能是不可能的。在這種情況下,使用isOnEventSupported()方法可以檢查在實際調用之前是否可以調用該方法。 –
很簡單:
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
通常是不好的設計氣味!
最簡單的解決方案是在超類中製作onEvent
抽象。然後在不支持它的子類上用空主體覆蓋它。
所有的子類都會有onEvent()方法,您不能阻止繼承。如果onEvent()不是私有/靜態的。 **顯然,如果我嘗試迭代類型超類的列表,它必須是一個抽象的方法來工作**沒有得到這一行? –