2009-02-27 62 views
1

我已經使它成爲一個個人規則,在使用它之前繼承每個UI控件。在以前的生活中,我總是認爲這是你可以做的不太有用的事情之一,因爲理由總是好像是「我可能想要一次改變所有按鈕上的字體」......這是一種永不成功的動機......曾經......曾經。但是,最近的兩個項目已經改變了我對這種做法的看法。首先,我們需要一個一致的「ValueChanged」事件,以便我們可以輕鬆地在表單上實施「髒」標誌,而無需大量的switch語句在Textbox的「TextChanged」事件或ListBox的「SelectedIndexChanged」之間進行選擇。只是想要一個一致的東西來傾聽所有控件,並且對內置控件進行子類化很容易就能買到我們。什麼是「正確」的方式來隔離控制依賴

在第二個項目中,我們盡了一切努力與基本控件相處,因爲UI預計會非常簡單,但是幾個月後,顯然他們不會再削減它了,我們購買了Telerik控制套件。如果我們繼承了所有的控件,那麼將我們的派生控件更改爲從Telerik控件繼承將會爲我們全局應用這些更改。相反,我們必須在所有的表單設計師中進行一些搜索和替換。

因此,這裏是我的問題:什麼是相對的優勢和

  1. 弱點簡單地增加一個類,並使其從控件繼承。
  2. 添加一個新的「自定義控件」並繼承。
  3. 添加一個新的「組件」並繼承。

這三者最後都有相同的效果,你會得到一個新的Button類型放在你的表格上。我看到所有三個人都被不同的人使用,每個人似乎都認爲他們的方式是最好的。我想我應該把這個討論放在StackOverflow上,也許我們可以確定一個共識,就是哪一個是「正確」的方式。

注:我已經有我的個人意見,哪些是「正確」,但我想看看世界的想法。

回答

1

如果兩個& 2都繼承,那麼它們在功能上是相同的,不是嗎?如果其中一個是封裝一個控件?在這種情況下,你有很多pass-thru成員要添加。我不會推薦它。如果沒有很好的理由,我簡直不會添加額外的繼承......例如,「改變的事件」可能已經被一些重載等處理過了。在C#3.0中,由於擴展方法 - 即你可以擁有的東西,如:

public static AddChangeHandler(
     this TextBox textbox, EventHandler handler) { 
    testbox.TextChanged += handler; 
} 
public static AddChangeHandler(
     this SomethingElse control, EventHandler handler) { 
    control.Whatever += handler; 
} 

,只是使用myControl.AddChangeHandler(handler);(依靠靜態類型的myControl來解決相應的擴展方法)。

當然,你可以退後一步,聽聽你自己的事件模型,而不是UI - 讓UI以基本方式更新模型,並在你自己的對象模型中有邏輯與控件無關)。

+0

在我們的例子中,我們使用的是被動視圖MVP模型,所以在模型層面上的傾聽不適合我們。上面的例子被簡化,只是爲了設置問題本身。 1和2在功能上是相同的,但是由於設計器文件而在結構上不同。 – Mel 2009-02-27 13:24:44

0

我使用組合。我只需創建一個新的UserControl並添加我需要的控件。這工作正常,因爲:

  • 無論如何,我從來沒有使用這麼多的屬性,所以傳遞方法保持在最低限度。
  • 我可以從幼稚的方法入手,稍後再細化。
  • 外觀和感覺的屬性應該在整個網站中保持一致。現在我可以一勞永逸地設置它們。
相關問題