2012-10-05 36 views
1

我正在解析具有兩個屬性(KeyValue)的值的數組。修改繼承類中的select case的最佳方法

根據關鍵字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 

我首先想簡單地建立一個新的類,並繼承老班。但是由於所有的邏輯都在選擇的情況下,那就需要完全重建代碼重疊。有沒有人有一個想法如何更好地構建這個?

回答

1

您應該爲每個關鍵字創建一個方法。

例如爲您的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 
+0

謝謝,看起來很有希望! 我會嘗試它,如果它按需要工作接受你的答案。 –

0

你可以a總是調用基類的默認行爲方法。例如,假設您只想覆蓋鍵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 
+0

Thx,這也會起作用 - 但對於案例中的代碼必須修改的情況很困難。 我認爲牛排先生的解決方案在這裏效果更好,所以我會用他的解決方案。對不起大家 ;) –