2012-06-10 105 views
7

我發現用Java編寫的用於使用定時器/ TimerTask的類代碼一個很好的例子......編寫c#實現抽象類inline?

我現在把這個到C#的'單Android系統的實施,但與轉換的麻煩直列實現抽象類的TimerTask的

// Here's the original java code 

private void resetMapChangeTimer()  
{   
mChangeDelayTimer.schedule(
new TimerTask()   
    {    
     @Override    
     public void run()    
     {     
     // Some code to run   
     }   
    }, longTenSeconds);  
} 

當我實現此在c#,我想創建從TimerTask的(抽象類)和運行方法等繼承的類內聯,而無需創建一個單獨的類(擴展TimerTask)作爲上面的java代碼。

誰能告訴我C#的語法來創建這個抽象類內聯,而不是創建一個單獨的類只是爲了繼承和實施的TimerTask的?

回答

6

C#不支持嵌入式類作爲Java編寫的。你可以定義匿名方法,但不能定義整個類。所以你將不得不定義一個實現抽象類的獨立類。

+0

啊...... OK,感謝。想知道爲什麼我找不到這個文件!感謝Darin的回答。 – Bonshaw

5

由於達林說,一個匿名的功能是去這裏的路。你只是想指定行爲一位,所以只要該方法接受一個Action,然後調用者可以使用匿名函數(或者匿名方法或lambda表達式)。調用代碼是這樣的:

changeDelayTimer.Schedule(() => { 
    // Code to run 
}, TimeSpan.FromSeconds(10)); 

或者,如果你有很多的代碼,你想使用的方法,用方法組轉換:

changeDelayTimer.Schedule(MethodContainingCode, TimeSpan.FromSeconds(10)); 

在Java中,我很少找到我想要做的比覆蓋一個匿名內部類中的單個方法更反正 - 在C#這樣的匿名函數幾乎總是很好的工作在這裏。

從Java代碼移植到C#,這一點很重要,不要試圖保持Java的成語 - 保留相同目標,但移植到.NET的成語,在這種情況下被使用委託來表示單件以抽象的方式表現行爲。

0

如果你想使用/擴展現有的Java類,你可以實現一個通用助手類:

class MyTimerTask: TimerTask 
{ 
    private Action action; 

    public MyTimerTask(Action action) 
    { 
     this.action = action; 
    } 

    public override void Run() 
    { 
     if(action != null) 
      action(); 
    } 
} 

然後,您可以使用匿名方法:

mChangeDelayTimer.Schedule(new MyTimerTask(() => 
{ 
    //Do something 

}), longTenSeconds); 

要在最好的C#經驗你的項目,你可以進一步添加一個擴展方法。在項目中創建一個公共靜態類的地方:

public static class TimerHelper 
{ 
    public static void Schedule(this DelayTimer /*or whatever your timer class is*/ timer, Action action, int delay) 
    { 
     if(timer == null) 
      throw new ArgumentNullException("timer"); //null check needed because this method is not really an instance method 

     timer.Schedule(new MyTimerTask(action), delay); 
    } 
} 

然後你可以用下面的代碼:(該TimerHelper類必須是「看得見」的執行上下文的擴展方法展現出來,因此它是公共的)

mChangeDelayTimer.Schedule(() => 
{ 
    //Do something 

}, longTenSeconds);