2

我有一个包含静态对象的类:obj和一个抽象方法AbsFoo(); 继承者,需要实现AbsFoo,但我也想在实现之前强制锁定obj当然,在实现之后释放锁。

我怎样才能做到这一点?

4

4 回答 4

3

您需要使用模板方法模式:

public void AbsFoo(){
   lock(obj){
      doActualWork();
   }
}

protected abstract void DoActualWork();

简而言之,您不要让实现者覆盖 AbsFoo,而是在您的初始化代码(在本例中为锁定)之后委托给一个方法。

于 2013-02-21T07:57:50.330 回答
2

唯一的方法是在你的基类中运行代码。

您将创建一个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
    }
}
于 2013-02-21T07:58:38.923 回答
0

我认为你应该扩展你的设计:

在基类中准备受保护的抽象方法: AbsFooImpl() 和 AbsFoo(),如下所示:

object AbsFoo()
{
    lock(obj)
    {
        AbsFooImpl();
    }
}
于 2013-02-21T07:58:25.980 回答
-1

这是怎么做的:

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.

    }
}

不要忘记使用密封!

于 2013-02-21T08:04:36.440 回答