簡體   English   中英

寫c#實現抽象類內聯?

[英]write c# implementation of abstract class inline?

我找到了一個很好的用java編寫的代碼示例,用於使用timer / timertask類...

我目前正在將其轉換為c#用於'Mono for 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(抽象類)和run方法等的類,而不必像上面的java代碼那樣創建一個單獨的類(擴展TimerTask)。

任何人都可以建議我使用c#語法來創建這個抽象類內聯而不是創建一個單獨的類來繼承和實現TimerTask嗎?

C#不支持Java中的內聯類。 您可以定義匿名方法,但不能定義整個類。 因此,您必須定義一個實現抽象類的單獨類。

正如達林所說,匿名功能是前往這里的方式。 您只是嘗試指定一點行為,因此只需讓方法接受一個Action ,然后調用者就可以使用匿名函數(匿名方法或lambda表達式)。 調用代碼如下所示:

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

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

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

在Java中,我很少發現我想做的事情不僅僅是覆蓋匿名內部類中的單個方法 - 所以C#中的匿名函數幾乎總是在這里工作。

將代碼從Java移植到C#時,重要的是不要試圖保留Java慣用語 - 保留相同的目標 ,而是移植到.NET習慣用法,在這種情況下,使用委托以抽象方式表示單個行為。

如果要使用/擴展現有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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM