Es gibt eine Klassenhierarchie von Aufgaben, die von der Klasse A durchgeführt werden könnenlange case-Anweisung auf Argument Klasse Vermeidung
Innerhalb der Klasse A gibt es eine Erklärung für die Task-Klasse und den Aufruf der entsprechenden Handler Überprüfung langen Falles ist Methode.
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
Die Aufgaben haben ihre individuellen Parameter, Validierungslogik usw. Das Beispiel ist vereinfacht.
Ich möchte die Fallaussage vermeiden und suche nach alternativen Lösungen.
Die allgemeine Idee ist die Zuordnung eines Klassentyp zu einem Handler (der Klasse), die irgendwie wie dies funktionieren könnte:
Delegate Sub Handler(Task As Task)
Private TypeToHandlerDict As New Dictionary(Of System.Type, Handler) From { _
{GetType(TaskX), AddressOf PerformTaskX}, _
{GetType(TaskY), AddressOf PerformTaskY} _
}
so, dass ich die PerformTask Methode Inhalt mit dem viel eleganter ersetzen:
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
Aber es funktioniert nicht.
Der Delegat bindet an Typ Task, aber die Handler-Methoden akzeptieren einen Task-Unterklasse-Parameter. Ich verwende Option Strict. Ich könnte alle Handler-Methoden neu schreiben, um ein Task-Objekt zu akzeptieren und eine explizite Umwandlung durchzuführen, aber das ist ebenso unelegant.
Irgendwelche Vorschläge? Vielen Dank!
Update: Hier ist die Lösung dank der Antwort von @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
Können Sie eine 'Perform' oder' Execute' Methode, um die Aufgabe Klassen hinzufügen und lassen sie die Arbeit machen? Vielleicht mit einer 'ITask'-Schnittstelle, falls nötig. – Plutonix
Können Sie PerformTask als Muss-Funktion innerhalb der Task überschreiben und jede TaskX ihre eigene Version implementieren? Auf diese Weise rufen Sie einfach task.PerformTask() –
Nicht umsonst, aber Sie haben 8 Fragen gestellt und 10 Antworten bekommen, aber keine von ihnen als akzeptiert markiert. Die Annahme der besten Antwort, falls vorhanden, und Upvoting hilft anderen Benutzern, gute Antworten zu finden. Die [Tour] erklärt dies und andere Dinge in sehr kurzer Form. – Plutonix