写c#实现抽象类内联?

Bon*_*haw 10 c# mono android abstract-class

我找到了一个很好的用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);    
}
Run Code Online (Sandbox Code Playgroud)

当我在c#中实现它时,我想在线创建一个继承自TimerTask(抽象类)和run方法等的类,而不必像上面的java代码那样创建一个单独的类(扩展TimerTask).

任何人都可以建议我使用c#语法来创建这个抽象类内联而不是创建一个单独的类来继承和实现TimerTask吗?

Dar*_*rov 8

C#不支持Java中的内联类.您可以定义匿名方法,但不能定义整个类.因此,您必须定义一个实现抽象类的单独类.


Jon*_*eet 5

正如达林所说,匿名功能是前往这里的方式.您只是尝试指定一点行为,因此只需使方法接受Action,然后调用者就可以使用匿名函数(匿名方法或lambda表达式).调用代码如下所示:

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

或者如果你有很多代码,你想要使用方法组转换:

changeDelayTimer.Schedule(MethodContainingCode, TimeSpan.FromSeconds(10));
Run Code Online (Sandbox Code Playgroud)

在Java中,我很少发现我想做的事情不仅仅是覆盖匿名内部类中的单个方法 - 所以C#中的匿名函数几乎总是在这里工作.

将代码从Java移植到C#时,重要的是不要试图保留Java惯用语 - 保留相同的目标,而是移植到.NET习惯用法,在这种情况下,使用委托以抽象方式表示单个行为.