静的オブジェクト: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.
}
}
密封されたものを使用することを忘れないでください!!!