我正在創建一個小遊戲的過程。引擎將會有一些GUI可以訂閱的事件。這些事件是:如何處理多個事件參數
- ballselected
- balldeselected
- ballmoved
- ballremoved
這都將是很好,如果我只有一個類型的球,但也有X個球類型。它們都來自一個抽象的Ball類。
每個球類型都有自己的動作發生,當他們發生這個事件。他們都需要將不同的信息傳回給GUI。例如,我有這兩種球類型(更多的只是減少信息量)。
- BallBouncing
- BallExploding
BallBouncing需要告訴它可能已經移動到了GUI,所以只會傳回它自己的信息。
另一方面,BallExploding會破壞周圍的球。所以它需要說出它是哪個球以及它被破壞的所有球。
這兩種球類型都可以從同一個事件中觸發,但具有不同的事件參數。我可以包含一個值的字典,但不是每個類型都有一個自定義事件參數。
我還認爲,如果我創建了一個自定義事件參數,該參數包含了球並且從每個球類型繼承而來,我可以將事件參數轉換回來。
public abstract class BallBaseEventArgs : EventArgs
{
public Ball ball;
}
public class BallExplodingEventArgs : BallBaseEventArgs
{
public IList<Ball> explodedBalls;
}
因此,在GUI事件處理函數中,它會通過知道使用的球類型來投射事件參數。我不喜歡這個解決方案,因爲它感覺很髒並且綁得太緊。
所以我想我是問有沒有人有任何建議,想法如何解決這種情況請。
感謝
喬恩
編輯
OK,所以我想我會試着解釋我的結構多一點澄清,看看它需要我們:
我擁有一個包含Board和Ball接口的Objects DLL,它有兩個Enum的板類型和一個用於Ball類型(這主要用於工廠瞭解哪種類型的對象 創造)。該DLL還具有Ball類和Board類的各種實現。
抽象Ball類保存諸如顏色,其X和Y座標等信息,並選擇BallType Enum。它有幾個方法,Clone()(來自ICloneable)和CompareTo(使用Equals和散列值位)。
我有一個Instance Manager DLL,它具有一個單例對象,用於控制對Ball的Board和Game Configuration Data的訪問。這個DLL也包含BallFactory和boardFactory(不知道這些應該在Objects DLL中消失了,因爲它們不是可以說的對象,不確定這是否是一種很好的做法)。
然後我有引擎DLL。這涉及遊戲的所有邏輯。棋盤和球是如何創建的,爲什麼要創建它們以及如何使用它們。 Ball和Board類有一個LogicFactory(所有這些工廠都使用BallTypes和BoardTypes Enum來決定使用哪個實現)。
的邏輯類決定如何董事會到處移動球和調用球的動作方法:
- ballselected
- balldeselected
- ballmoved
- ballremoved
這是在球邏輯類。
我沒有把所有的邏輯放在它們自己的對象中的原因是我認爲邏輯和功能應該與存儲關於它的數據的對象分開(這可能是完全錯誤的)。大多數有關Ball如何移動/操作的功能都包含在BallLogic低音類中,每個派生類決定它所調用的內容(所有方法都是虛擬的,因此如果需要也可以更改)。
感謝您的所有輸入,它的確很成功。我這樣做是爲了好玩,但主要是爲了學習正確(和錯誤)的方式來開發不同類型的應用程序。
這意味着您僅使用BallTypes層次結構來繼承屬性,並且操作不會被覆蓋。由於彈跳球不會爆炸,而且爆炸球不會彈起,這意味着它們的不少屬性也不相同,所以你在抽象類中保存了什麼信息?順便說一下,如果球可以屬於一個層次結構,那麼爲什麼不能有事件參數?在這個例子中,專業化並不好,因爲如果你需要添加一個類型,你會怎麼做?你如何通過向畫布報告更新來增加新的代碼? – 2009-12-16 13:22:42