修改继承类中的select case的最佳方法

时间:2012-10-05 08:36:09

标签: vb.net inheritance

我正在使用两个属性(KeyValue)解析值数组。

根据关键字Key调用某些函数来测试Value

麻烦的是,我的任务是修改新项目的某些项目的关键字。它们共享90%的关键字,但有些是每个项目独有的,有些是常见的,但需要调用其他功能。

目前代码如下:

Public Structure Options
    Public Property Key
    Public Property Value
End Structure

Public Sub CheckPresentation(OptionsList as List(of Options))
    for each Elem in Optionslist
        select case elem.key
            case 1
                if elem.Value<>"bla" then
                    logger.info("bla")
                end if
            case 2
                 ...
            case 99
                 ...
       end select
    next
End Sub

我首先想简单地构建一个新类并继承旧类。但由于所有逻辑都在选择的情况下,这将需要完全重建与巨大的代码重叠。有没有人知道如何更好地建立这个?

2 个答案:

答案 0 :(得分:1)

您应该为每个关键字创建一种方法。

e.g。对于case 1,请创建以下方法:

Sub LogIfNotBla(elem As Options)
    If elem.Value<>"bla" Then
        logger.info("bla")
    End If
End Sub

为每个关键字执行此操作。

然后,创建一个映射,使用字典将每个关键字映射到其处理程序:

Dim handler = new Dictionary(Of Int32, Action(Of Options)) From 
{ 
    {1,  AddressOf LogIfNotBla},
    {2,  AddressOf Foo},
    {99, AddressOf FooBar}
}

而不是你的巨大Select Case,只需使用查找来调用正确的方法:

Public Sub CheckPresentation(OptionsList as List(of Options))
    For Each elem in Optionslist
        handler(Elem.Key)(elem)
    Next
End Sub

现在您可以通过两种方式改变行为:

<强>重写

标记方法overridable并在子类中覆盖它们:

Overrides Sub LogIfNotBla(elem As Options)
    If elem.Value<>"bla" And SomeThingElse Then
        SomeOtherLogger.info("bla")
    End If
End Sub

<强>重新配置

更改handler字典以调用特定关键字的其他方法:

handler(1) = AddressOf AnotherMethodInsteadOfLogIfNotBla

答案 1 :(得分:0)

您始终可以调用基类的默认行为方法。例如,假设您只想覆盖键1,4和72的行为,您可以在派生类中执行此操作:

Public Overrides Sub CheckPresentation(OptionsList as List(of Options))
    For Each Elem In Optionslist
        Select Case elem.key
            Case 1
                ...
            Case 4
                ...
            Case 72
                ...
            Case Else
                MyBase.CheckPresentation(OptionsList)
        End Select
    Next
End Sub