【发布时间】:2009-02-06 03:40:03
【问题描述】:
这是我的课程的简化版本:
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 方法成为委托属性,设置任何派生类 在其构造函数中将属性分配给私有方法,并且仅在委托不为空时才获得锁。这样更好,但还是有点糟糕。
【问题讨论】:
标签: c# reflection inheritance overriding