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 に答える