2010-12-06 26 views
1

第一個問題:)的WinForms - 模擬多重繼承

基本上我想achief 多重繼承的形式在.NET WinForms項目

我們使用具有2個基類的框架:UIForm和UIWizard。我們(不幸)被迫使用這些表單來開始我們自己的實現。

除此之外,我們還構建了以下結構: UIForm是OurForm的超類。 UIWizard是OurWizard的超類。 OurForm和OurWizard幾乎是雙胞胎。
OurForm本身也是其他形式的超:OurCrudBase,OurListBase,OurSearchBase,...

機會
OurForm和OurWizard含有「卷宗」相關的屬性和方法,而這個檔案,上下文與許多形式不相關。更糟糕的是,我們最近已經開始補充說,有全新的語境形式:現有的檔案,而且客戶端,統計等

所以這裏
我們想要的形式,既CrudBase和DossierBase。或者是一個ListBase和ClientBase等。爲了實現這種單繼承,基本形式的數量會爆炸(即DossierBase + CrudBase + ListBase等)。所以我們不想這樣做。


我們正在研究說,一個UIForm實際上是一個UIWizard但只有「一步到位」刪除UIForm的解決方案。 BaseClass的數量已經減半了。

基類實際上可以分爲兩類
- 功能:檔案,客戶,統計,...
- 技術:界面污物,列表,搜索,...

UIForm將成爲技術或功能形式的超類。另一種類型將作爲戰略實施。

功能派生類:
+甲形式只能可能是功能類別中的一個。無法爲「stastics」和「client」製作表格。這樣繼承就有意義了。
+實施技術功能作爲戰略可能是可能的。我正在考慮一個接口,基本上有一種方法,可以在窗體上發生的所有事情:加載,保存,關閉,關閉,...
-不同策略之間的相互作用可能會混亂。 (即確保當你把兩個列表和對界面污物的形式的實現不用螺絲海誓山盟)

技術派生類:
+不知怎的,我有這種方法更好的感覺。 (儘管我只能列出負面點)
-當你想要組合例如List + Crud時,你需要重複類。然而,重複量很小。
-客戶,卷宗,統計沒有共同點。所以把他們變成戰略是相當困難的。

我想我已經非常多地回答了我自己的問題。但你同意嗎?或者你是否認爲我已經過時了,是否應該儘可能在超級類別中接受並儘可能少地繼承?
或者也許是一個完全不同的方法來解決這個問題?

任何幫助將不勝感激!

乾杯,
沃特

+0

多重繼承可以說是一件壞事。根據我的經驗,表單繼承通常是一件非常糟糕的事情。我無法想象這將是多重形式繼承的噩夢...... – 2010-12-06 17:31:06

回答

3

根據您的描述,我不明白爲什麼你需要繼承的。似乎你可能會更好地使用組合而不是繼承。

我建議你創建組件,控件和代碼模板來處理不同的問題,然後你可以拖動你需要的東西。您可以只有一個基本形式覆蓋您需要覆蓋的方法/屬性,併爲組件/控件提供一種簡單的方法(例如引發事件)來執行他們需要使用的任何自定義工作。

+0

謝謝!我會研究一下。 繼承與組合的快速參考:http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance – Laoujin 2010-12-06 17:31:47