我有一個包含靜態對象類:obj
和抽象方法:AbsFoo();
的繼承者,需要實現AbsFoo
,但我想也在執行之前強制執行鎖而不是obj
,當然在執行之後釋放鎖。如何強制繼承自己implamentation之前運行某些代碼
我該如何做到這一點?
我有一個包含靜態對象類:obj
和抽象方法:AbsFoo();
的繼承者,需要實現AbsFoo
,但我想也在執行之前強制執行鎖而不是obj
,當然在執行之後釋放鎖。如何強制繼承自己implamentation之前運行某些代碼
我該如何做到這一點?
做的唯一途徑這是在你的基類中運行代碼。
您將創建一個由用戶調用的方法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
}
}
您需要使用模板方法模式:
public void AbsFoo(){
lock(obj){
doActualWork();
}
}
protected abstract void DoActualWork();
總之,你不要讓實現者覆蓋AbsFoo,而是其委託給,你的初始化代碼之後(在這種情況下的方法,鎖定)。
你已經更快了:)我會以同樣的方式。 – 2013-02-21 07:58:37
但是在這種情況下,實現者可以直接調用DoActualWork(),他甚至可能不知道「AbsFoo()」的存在。 – choppy 2013-02-21 08:10:55
@choppy:實現者不必調用任何東西。有關更完整的示例,請參閱[我的答案](http://stackoverflow.com/a/14997187/572644)。 – 2013-02-21 08:29:21
我想你應該延長您的設計:
準備受保護的抽象方法: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.
}
}
不要忘記使用密封!
-1:非壓倒一切的方法'密封'不僅是無用的,而且僅僅是非法的:「不能被密封,因爲它不是一個覆蓋」 – 2013-02-21 08:10:02
錯誤我修好了,謝謝! – 2013-02-21 08:27:33
你也不想讓'AbsFoo''虛擬',因爲那樣可以讓派生類繞過整個事情。你爲什麼要蓋「doActualWork」? – 2013-02-21 08:28:35
沒有辦法做到這一點。 – 2013-02-21 07:56:44