我正在使用两个属性(Key
和Value
)解析值数组。
根据关键字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
我首先想简单地构建一个新类并继承旧类。但由于所有逻辑都在选择的情况下,这将需要完全重建与巨大的代码重叠。有没有人知道如何更好地建立这个?
答案 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