2013-02-21 39 views
2

我有一個包含靜態對象類:obj抽象方法AbsFoo(); 的繼承者,需要實現AbsFoo,但我想也在執行之前強制執行而不是obj,當然在執行之後釋放鎖。如何強制繼承自己implamentation之前運行某些代碼

我該如何做到這一點?

+1

沒有辦法做到這一點。 – 2013-02-21 07:56:44

回答

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 
    } 
} 
3

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

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

protected abstract void DoActualWork(); 

總之,你不要讓實現者覆蓋AbsFoo,而是其委託給,你的初始化代碼之後(在這種情況下的方法,鎖定)。

+0

你已經更快了:)我會以同樣的方式。 – 2013-02-21 07:58:37

+0

但是在這種情況下,實現者可以直接調用DoActualWork(),他甚至可能不知道「AbsFoo()」的存在。 – choppy 2013-02-21 08:10:55

+0

@choppy:實現者不必調用任何東西。有關更完整的示例,請參閱[我的答案](http://stackoverflow.com/a/14997187/572644)。 – 2013-02-21 08:29:21

0

我想你應該延長您的設計:

準備受保護的抽象方法:AbsFooImpl()和AbsFoo()在你的基類,它看起來像:

object AbsFoo() 
{ 
    lock(obj) 
    { 
     AbsFooImpl(); 
    } 
} 
-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. 

    } 
} 

不要忘記使用密封!

+0

-1:非壓倒一切的方法'密封'不僅是無用的,而且僅僅是非法的:「不能被密封,因爲它不是一個覆蓋」 – 2013-02-21 08:10:02

+0

錯誤我修好了,謝謝! – 2013-02-21 08:27:33

+0

你也不想讓'AbsFoo''虛擬',因爲那樣可以讓派生類繞過整個事情。你爲什麼要蓋「doActualWork」? – 2013-02-21 08:28:35

相關問題