沒有可以由A類避免了參數類長的case語句
裏面的A級執行的任務的類層次結構還有很長的case語句檢查任務類,並調用相應的處理程序方法。
Class Task
End Class
Class TaskX
Inherits Task
End Class
Class TaskY
Inherits Task
End Class
...
Class A
Public Sub PerformTask(Task As Task)
Select Case Task.GetType
Case GetType(TaskX)
PerformTaskX(CType(Task, TaskX))
Case GetType(TaskY)
PerformTaskY(CType(Task, TaskY))
End Select
End Sub
Private Sub PerformTaskX(Task As TaskX)
End Sub
Private Sub PerformTaskY(Task As TaskY)
End Sub
...
End Class
任務有它們各自的參數,驗證邏輯等。這個例子被簡化了。
我想避免這種情況,我正在尋找替代解決方案。
的總體思路是類映射類型的處理程序(類),這可以在某種程度上像這樣工作:
Delegate Sub Handler(Task As Task)
Private TypeToHandlerDict As New Dictionary(Of System.Type, Handler) From { _
{GetType(TaskX), AddressOf PerformTaskX}, _
{GetType(TaskY), AddressOf PerformTaskY} _
}
,這樣我可以用更優雅的更換PerformTask方法內容:
Public Sub PerformTask(Task As Task)
Dim handler As Handler = Nothing
If Not TypeToHandlerDict.TryGetValue(Task.GetType, handler) Then Exit Sub
handler(Task)
End Sub
但它不起作用。
委託綁定到Task類型,但處理程序方法接受任務子類參數。我正在使用Option Strict。 我可以重寫所有處理程序方法來接受任務對象並執行顯式強制轉換,但這同樣不雅觀。
有什麼建議嗎? 謝謝!
更新:這是解決方案感謝@Sehnsucht的答案。
Class Task
Public MustOverride Sub Perform(a As A)
End Class
Class TaskX
Inherits Task
Public Overrides Sub Perform(a As A)
a.DoThis()
End Sub
End Class
Class TaskY
Inherits Task
Public Overrides Sub Perform(a As A)
a.DoThat()
End Sub
End Class
...
Class A
Public Sub PerformTask(Task As Task)
Task.Perform(Me)
End Sub
Public Sub DoThis()
End Sub
Public Sub DoThat()
End Sub
...
End Class
你可以添加一個'Perform'或'Execute'方法任務類,讓他們做的工作?如果需要,也許使用'ITask'接口。 – Plutonix
你可以把PerformTask作爲一個必須覆蓋功能內的任務和他們每個TaskX實現自己的版本?這樣,你只需調用task.PerformTask() –
除了你已經提出了8個問題並獲得了10個答案,但沒有標記任何一個被接受。接受最好的答案,如果有的話,並upvoting幫助其他用戶找到很好的答案。 [參觀]以非常簡短的形式解釋這一點和其他內容。 – Plutonix