Там есть иерархия классов задач, которые могут быть выполнены по классу А.Избежания долго заявление дела о классе аргумента
Внутри класс А есть длинный сазе проверка на класс задач и вызов обработчика корреспондентского метод.
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. Я мог бы переписать все методы обработчика, чтобы принять объект Task, и выполнить явное приведение, но это одинаково неэлегантно.
Любые предложения? Спасибо!
Обновление: Вот решение, полученное от @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' для классов Task и пусть они делают свою работу? Возможно, при необходимости используйте интерфейс 'ITask'. – Plutonix
Можете ли вы поставить PerformTask как функцию переопределения функции внутри задачи, и каждая из них TaskX реализует свою собственную версию? Таким образом вы просто вызываете task.PerformTask() –
Не зря, но вы задали 8 вопросов и получили 10 ответов, но не отметили ни одного из них, как принято. Принятие лучшего ответа, если таковое имеется, и повышение, помогает другим пользователям находить хорошие ответы. [Тур] объясняет это и другие вещи в очень краткой форме. – Plutonix