我有一个包含静态对象的类:obj
和一个抽象方法:AbsFoo();
继承者,需要实现AbsFoo
,但我也想在实现之前强制锁定,obj
当然,在实现之后释放锁。
我怎样才能做到这一点?
您需要使用模板方法模式:
public void AbsFoo(){
lock(obj){
doActualWork();
}
}
protected abstract void DoActualWork();
简而言之,您不要让实现者覆盖 AbsFoo,而是在您的初始化代码(在本例中为锁定)之后委托给一个方法。
唯一的方法是在你的基类中运行代码。
您将创建一个public
由用户调用的方法。此方法执行始终需要执行的代码,然后调用执行实际工作并在派生类中被覆盖的受保护方法:
public class Foo
{
private readonly object _syncRoot = new object();
public void AbsFoo()
{
// You can do more here, like some logging
lock(_syncRoot)
{
AbsInternal();
}
}
protected abstract void AbsInternal();
}
public class Bar : Foo
{
protected override void AbsInternal()
{
// do work.
// Note: No call to base.AbsInternal(); or base.AbsFoo(); here
}
}
我认为你应该扩展你的设计:
在基类中准备受保护的抽象方法: AbsFooImpl() 和 AbsFoo(),如下所示:
object AbsFoo()
{
lock(obj)
{
AbsFooImpl();
}
}
这是怎么做的:
public class Foo
{
private readonly object _syncObj = new object();
public void AbsFoo()
{
lock(syncObj )
{
doActualWork();
}
}
protected abstract void doActualWork();
}
public class Bar : Foo
{
protected override void doActualWork()
{
// do work.
}
}
不要忘记使用密封!