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?