这是我的课程的简化版本:
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 时获得锁;如果不是,我不希望该方法在更新非共享数据之前阻塞并等待所有其他更新共享数据的运行实例。
因此,Method 要做的(看似)显而易见的事情是检查并查看 UpdateSharedData 的当前实例的实现是否覆盖了基类的实现。我很确定如果不使用反射,这是不可能的,而且这样做可能是不可取的。
我已经想到了一些解决方法,但它们都很尴尬:
- 添加派生类的构造函数设置的受保护的布尔属性,并检查该属性以查看是否需要锁定。这在从派生类中隐藏锁定代码方面做得非常糟糕。
- 使 UpdateSharedData 方法成为委托属性,让任何派生类在其构造函数中将该属性设置为私有方法,并且仅在委托不为空时获取锁。这更好,但它仍然有点糟糕。