Beim Programmieren von Ereignissen in C # wird empfohlen , einen Delegaten in folgender Form zu erstellen:
delegate XEventHandler(object sender, XEventArgs e);
Meine Frage bezieht sich auf das erste Argument des Delegierten object sender
. Muss es immer ein Generikum sein object
? Ein Absender vom Typ führt object
immer zu einem ähnlichen Code.
val = ((ConcreteType)sender).Property;
oder noch ausführlicher,
ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }
Ein Argument gegen stark typisierte Absender ist, dass andere Objekte das Ereignis weiterleiten können , ohne sich um den Typ zu kümmern. Während dies in GUI-Umgebungen sinnvoll sein kann, bin ich mir nicht sicher, ob es außerhalb einer GUI von Nutzen sein könnte.
Was ist, wenn die Klasse des Absenders immer bekannt ist (zumindest als abstrakte Klasse)? Zum Beispiel, wenn ich eine bin die Umsetzung ListChanged
Ereignisses in einer abstrakten List
Klasse, und wenn andere Klassen werden es (zB erben LinkedList
, ArrayList
), ist es in Ordnung , meinen Delegaten mit einem Sender des Typs zu definieren List
?
delegate ListChangedEventHander(List sender, ListChangedEventArgs e);
Oder hätte es einen Nachteil, den konventionellen object sender
auf einen spezifischeren Typ umzustellen?
System.Windows.Forms
Namespace ist der Ort, wo Ereignisse am häufigsten besucht werden, und es sinnvoll , auf denen abonnierenClick
FallButton
oder einCheckBox
. Damit der Absender muss generisch sein. ...List
s.Der Grund für die Empfehlung ist, dass zukünftige Änderungen möglich sind, die nicht unbedingt Änderungen am vorhandenen Code und insbesondere an der öffentlichen Schnittstelle erfordern.
Der Ereignismechanismus selbst kann weiterhin für Ereignisse im "VB6" -Stil verwendet werden. Sie müssen jedoch alle vorhandenen Konsumenten ändern, wenn Sie jemals die Signatur ändern müssen (oder schlimmer noch: Erstellen Sie neue Versionen derselben Ereignisse). Mit dem empfohlenen Ansatz können Sie die Signatur aktualisieren, ohne den vorhandenen Code zu reparieren, solange die neueren Elemente von den vorhandenen erben.
quelle