c# - tipos - Invocación de un evento de tipo campo polimórfico
tipos de polimorfismo en java (1)
Bueno, en realidad tienes dos eventos tipo campo aquí. Su sustitución sobrescribirá la parte de agregar / eliminar, pero tendrá dos campos: uno en TableMain
y otro en TableSub
. Solo el que está en TableSub
nunca será nulo, a menos que el valor se establezca explícitamente en TableMain
... por lo tanto, si TableMain
alguna vez intenta generar el evento en sí, no llamará al mismo conjunto de controladores que TableSub
. Básicamente, va a comportarse de manera extraña.
El enfoque correcto es proporcionar un método protegido en TableMain
para permitir que el evento sea generado por subclases:
protected void OnUpdateFilter()
{
Action handler = UpdateFilter;
if (handler != null)
{
handler();
}
}
Luego haga que el evento no sea virtual y elimine la anulación en TableSub
.
Tenga en cuenta que la firma de su evento no coincide con la convención normal para eventos: ¿hay alguna razón para no usar EventHandler
?
Teniendo en cuenta el código a continuación:
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???
}
}
}
En este código, ReSharper muestra la alerta "invocación de un evento de tipo campo polimórfico".
Mi pregunta es: ¿Qué significa realmente? ¿Y es una alerta para una mala práctica de programación? Además, ¿es una mala práctica llamar a un evento polimórficamente? (Sabiendo que un evento solo puede surgir de la clase que lo ha declarado).