Aquí es una versión simplificada de mi clase:¿Puede una clase base determinar si una clase derivada ha reemplazado a un miembro virtual?
public abstract class Task
{
private static object LockObject = new object();
protected virtual void UpdateSharedData() { }
protected virtual void UpdateNonSharedData() { }
public void Method()
{
lock(LockObject)
{
UpdateSharedData();
}
UpdateNonSharedData();
}
}
que estoy tratando de ocultar el código de bloqueo de las clases derivadas. Pero solo quiero obtener el bloqueo si la clase derivada anula UpdateSharedData; si no lo hace, no quiero que el método bloquee y espere en todas las demás instancias en ejecución que actualicen los datos compartidos antes de que actualice los datos no compartidos.
Por lo tanto, lo (aparentemente) obvio para Method es comprobar y ver si la implementación de la instancia actual de UpdateSharedData ha anulado la implementación de la clase base. Estoy bastante seguro de que esto no es posible sin usar el reflejo, y probablemente no sea deseable hacerlo.
he pensado en algunas soluciones a este, pero todos son bastante incómoda:
- añadir un alojamiento protegido que bool de la clase derivada conjuntos constructor, y comprobar que la propiedad para ver si es una cerradura necesario. Eso está haciendo un trabajo bastante terrible al ocultar el código de bloqueo de las clases derivadas.
- Haga que el método UpdateSharedData sea una propiedad delegada, tenga cualquier clase derivada establezca la propiedad de un método privado en su constructor, y obtenga el bloqueo únicamente si el delegado no es nulo. Eso es mejor, pero todavía es una mierda.
Me acabo de dar cuenta de que IHasSharedData se parece mucho al código de LOLCats. :-) ICanHazSharedData? – tvanfosson
¡Eso fue lo primero que noté también! Va a ser muy difícil para mí resistirme a darle un nombre así. Esta es exactamente la respuesta que estaba buscando, sin embargo. –