Podczas programowania zdarzeń w języku C # zaleca się utworzenie delegata w postaci:
delegate XEventHandler(object sender, XEventArgs e);
Moje pytanie jest na pierwszym argumencie delegata object sender
. Czy zawsze musi być ogólny object
? Posiadanie nadawcy typu object
zawsze skutkuje kodem podobnym do tego.
val = ((ConcreteType)sender).Property;
lub jeszcze bardziej gadatliwy
ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }
Jednym argumentem przeciwko nadawcom o silnym typie jest to, że inne obiekty mogą przekazywać zdarzenie bez obawy o typ. Chociaż może to mieć sens w środowiskach GUI, nie jestem pewien, czy mogłoby to przynieść korzyści poza GUI.
Co się stanie, jeśli klasa nadawcy jest zawsze znana (przynajmniej jako klasa abstrakcyjna)? Na przykład, jeśli mam wdrożenia ListChanged
zdarzenie w abstrakcyjnej List
klasy, a jeśli inne klasy będą dziedziczyć go (np LinkedList
, ArrayList
), to wszystko jest w porządku, aby określić mój delegata z nadajnikiem typu List
?
delegate ListChangedEventHander(List sender, ListChangedEventArgs e);
Czy może miałoby to negatywne skutki zmiany modelu konwencjonalnego object sender
na bardziej konkretny?