我想避免使用帶標籤的類和大的if-else塊或switch語句,並使用具有類層次結構的多態,而我認爲這是更好的做法。創建對象和多態性
例如,類似於下面的內容,其中執行方法的選擇僅依賴於類型爲Actor的對象的一個字段。
switch(actor.getTagField())
{
case 1: actor.act1(); break;
case 2: actor.act2(); break;
[...]
}
將成爲
actor.act();
與行爲方法將在演員的子類覆蓋。
然而,在運行時實例化的子類來決定最明顯的方法看起來非常類似於原始:
Actor newActor(int type)
{
switch(type)
{
case 1: return new Actor1();
case 2: return new Actor2();
[...]
}
}
因此它似乎沒有什麼真的已經取得了;邏輯剛剛被移動。
什麼是更好的方法來做到這一點?我能想出的唯一方法是爲Actor的每個子類實現一個工廠類,但這對於這樣一個簡單的問題來說似乎相當麻煩。
我是否在推翻這個?如果我在其他地方做了幾乎相同的事情,那麼看起來原來的改變就沒有意義了。
對不起,澄清,我想選擇哪個子類在運行時實例化,而不是在編譯時,如你的例子。這需要一個大開關或if-else塊,我想避免這種情況。我開始認爲這不是必要的,因爲只有在創作時才需要它。 – flowsnake 2012-04-28 23:05:47
嗯..實際上工廠幾乎沒有w /編譯vs運行時實例本身,而是創建Actor的責任和控制。例如,如果上述的Actor的創建發生在Event中,它是不是運行時? – 2012-04-29 00:15:27
你在做什麼是「決定」集中創造Actors ..你想要演員來自一個地方,在這種情況下......你無法繞過切換......因爲這是一個決定最終用戶。 – 2012-04-29 00:19:24