看來大家都很喜歡掃雷這個話題啊. 感謝大家指出了我代碼裡的問題,這裡徐小俠寫了一個很好的實現:
http://www.cnblogs.com/Chinese-xu/archive/2009/04/29/1446415.Html
同時他指出我並沒有完全按照面向對象的方法來設計,其實這個起源於我設計時候的一個初衷,在這裡澄清一下.
我一開始實現只個MineControl的時候,並沒有考慮要將所有的邏輯都放到MineControl Class中. 我認為MineControl其實和WinForm裡的普通Button,Label之類的沒有區別,都是一個View,用來顯示的. 只不過MineControl是專用來顯示掃雷中的一個Button的,所以會有123456789,flag,questionmark等不同的顯示狀態. 簡單地說,MineControl負責的是如何顯示的問題,至於什麼時候顯示,顯示什麼,這些邏輯都應該要和控件剝離. 在我的設計裡,MineControl只是一個VIEw,具體的邏輯都不應該出現在其中.
所以大家可以看到在我的代碼中,一些具體的邏輯,比如鼠標左鍵MouseDown,左右鍵雙擊,點中空白區域等等,這些具體的邏輯都是在Form1裡實現的. Form1根據用戶的輸入,來確定這些MineControl應該的表現是什麼,再通過Unseal(),Press()等接口來使界面發生變化.這樣做的好處顯而易見:在實現邏輯的時候,我們不需要關心顯示的細節,這樣程序的結構看上去就會更清晰一些.
其實每個人的對程序設計都會有自己的理解, 這樣的討論受益良多,我相信多看看別人的實現,對自己的提高是有很大幫助的. ^^