Biorąc pod uwagę poniższy kod:Inwokacja polimorficznego pola podobnego zdarzenia
public class TableMain {
public virtual event Action UpdateFilter;
....
}
public class TableSub : TableMain {
public override event Action UpdateFilter;
public void UpdateQuery() {
.....
if (UpdateFilter!=null) {
UpdateFilter(); // Invocation of polymorphic field-like event???
}
}
}
W tym kodzie ReSharper pokazuje alert „wezwaniem polimorficznych imprezy polu-like”.
Moje pytanie brzmi: Co to właściwie oznacza? I czy jest to ostrzeżenie dla złej praktyki programistycznej? Ponadto, czy złą praktyką jest polimorficzne wywołanie zdarzenia? (Wiedząc, że zdarzenie może zostać podniesione tylko z klasy, która go zadeklarowała.)
To brzmi jak duże potencjalne źródło błędu dla mnie, ponieważ najprawdopodobniej nie jest to, czego można się spodziewać podczas pisania takiego kodu. Nigdy wcześniej nie musiałem myśleć o tym konkretnym aspekcie. Czy wiesz, dlaczego mimo to zdarzenia wirtualne są syntaktycznie akceptowane? –
@John. Odnośnie --- "Zauważ, że twój podpis zdarzenia nie pasuje do zwykłej konwencji dla zdarzeń - jakikolwiek powód nie używania EventHandler?" Korzystam tylko z istniejącego delegata "Działania", ponieważ w tym przypadku nie potrzebuję żadnych argumentów (obiekt, zdarzenia) w subskrybentach tego wydarzenia. Czy to (znowu) kiepska praktyka programowania? Czy lepiej jest utworzyć oddzielnego (pustego) delegata dla tej sprawy? –
@Thomas: Są sposoby, którymi możesz * rozsądnie korzystać z nich - na przykład, możesz zalogować każdą subskrypcję, a następnie przekazać ją do wdrożenia podstawowego. Musisz też mieć możliwość efektywnego abstrakcji, aby móc umieścić je w interfejsach. –