Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写抽象类内联的c#实现?_C#_Android_Mono_Abstract Class - Fatal编程技术网

编写抽象类内联的c#实现?

编写抽象类内联的c#实现?,c#,android,mono,abstract-class,C#,Android,Mono,Abstract Class,我发现了一个很好的用java编写的使用定时器/定时器任务类的代码示例 我目前正在将其转换为c#,用于“Mono for Android”实现,但在转换抽象类TimerTask的内联实现时遇到了麻烦 // Here's the original java code private void resetMapChangeTimer() { mChangeDelayTimer.schedule( new TimerTask() {

我发现了一个很好的用java编写的使用定时器/定时器任务类的代码示例

我目前正在将其转换为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中的内联类。您可以定义匿名方法,但不能定义整个类。因此,您必须定义一个单独的类来实现抽象类。

正如Darin所说,匿名函数是实现这个抽象类的方法。您只尝试指定一点行为,因此只需让方法接受
操作
,然后调用方就可以使用匿名函数(匿名方法或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);