Вот упрощенная версия моего класса:
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();
}
}
Я пытаюсь скрыть код блокировки от производных классов. Но я хочу получить блокировку, только если производный класс переопределяет UpdateSharedData; если это не так, я не хочу, чтобы метод блокировал и ждал всех других работающих экземпляров, которые обновляют общие данные, прежде чем он обновляет не общие данные.
Таким образом, (на первый взгляд) очевидная вещь, которую должен сделать метод, - это проверить и посмотреть, не перекрыла ли реализация UpdateSharedData текущего экземпляра реализацию базового класса. Я уверен, что это невозможно без использования отражения, и, вероятно, это нежелательно.
Я подумал о некоторых обходных путях к этому, но все они довольно неловко:
- Добавьте защищенное свойство bool, которое устанавливает конструктор производного класса, и проверьте это свойство, чтобы увидеть, нужна ли блокировка. Это делает ужасную работу по сокрытию кода блокировки от производных классов.
- Сделайте метод UpdateSharedData свойством делегата, установите любой производный класс
свойство для закрытого метода в его конструкторе, и получить блокировку только в том случае, если делегат не равен NULL. Это лучше, но все равно отстой.