设计模式应用之一:控件清空

自定义控件容器框有一个清空方法,其中的代码是对内部包含的所有自定义控件进行清空操作,例如文本控件,把文本框的内容清空。
我原来在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();
    }
}

原文地址:https://www.cnblogs.com/yzx99/p/3360211.html