設計模式應用之一:控件清空

自定義控件容器框有一個清空方法,其中的代碼是對內部包含的全部自定義控件進行清空操做,例如文本控件,把文本框的內容清空。
我原來在VB中的代碼以下:
Public Sub Clear()
Dim C1 As Control
  For Each C1 In UserControl.ContainedControls
    Select Case TypeName(C1)
    Case "HYText", "HYNum", "HYDate", "HYMText"
      If C1.NoClear Then
      Else
        C1.Text = ""
      End If
    Case "HYCombo"
      If C1.NoClear Then
      Else
        C1.Text = ""
        C1.TextE = ""
      End If
    Case "HYCheck"
      If C1.NoClear Then
      ElseIf C1.DefaultValue <> "" Then
        C1.Value = C1.DefaultValue
      Else
        C1.Value = 0
      End If
    Case "HYOption"
      If C1.NoClear Then
      Else
        C1.Value = 1
      End If
    Case "HYGrid"
      If C1.NoClear Then
      Else
        C1.ClearGrid
      End If
    Case "HYPic"
      C1.ClearPic
    End Select
  Next
  RaiseEvent AfterClear
End Sub
它存在什麼問題?
·每增長一類控件,我就要在代碼中增長對應的 Case。
·代碼冗長
·清空的事情各式各樣,不在子控件類中完成,而在容器中完成,即容器的編寫者要對各個子控件熟悉(雖然如今子控件與容器控件編寫者是同一人)程序員

改進辦法:「針對接口編程」
C#中,定義一個接口IfConPub(或超類),並定義這個接口的一個方法 ClearValue。編譯器保證全部實現該接口的控件都必須實現這個方法。(VB6沒有這個保證)。這樣編寫子控件的程序員不會忘記實現這個方法。
代碼就簡化爲:
public void Clear()
{
    foreach (Control oConTemp in this.Controls)
    {
        IfConPub oC1 = oConTemp as IfConPub;
        if (oC1 !=null )
        {
            if (oC1.NoClear == true)
            {
            }
            else
            {
                oC1.ClearValue();
            }
        }
    }編程

    if (this.AfterClear != null)
    {
        this.AfterClear();
    }
}this

相關文章
相關標籤/搜索