2012-06-10 15 views
7

Encontré un gran ejemplo de código escrito en Java para el uso de un timer/timertask classes ...escribir la implementación C# de clase abstracta en línea?

Actualmente estoy convirtiendo esto en C# para una implementación 'Mono para Android', pero tengo problemas para convertir el aplicación en línea de la clase abstracta TimerTask

// Here's the original java code 

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

Cuando puedo aplicar esto en C#, me gustaría crear una clase heredada de TimerTask (clase abstracta) y el método de ejecución, etc en línea sin tener que crear una clase separada (extendiendo TimerTask) como lo hace el código java anterior.

¿Alguien puede aconsejarme sobre la sintaxis de C# para crear esta clase abstracta en línea en lugar de crear una clase separada solo para heredar e implementar TimerTask?

Respuesta

6

C# no admite clases en línea como en Java. Puede definir métodos anónimos pero no clases enteras. Por lo tanto, deberá definir una clase separada que implemente la clase abstracta.

+0

Ah ... Bien, gracias por eso. ¡Me preguntaba por qué no pude encontrar la documentación para esto! Gracias por la respuesta, Darin. – Bonshaw

5

Como dice Darin, una función anónima es el camino a seguir aquí. Solo intenta especificar un bit de comportamiento, así que simplemente haga que el método acepte un Action y luego el que llama puede usar una función anónima (ya sea un método anónimo o una expresión lambda). El código de llamada se vería así:

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

O si has tenido una gran cantidad de código, que te gustaría utilizar un método, con una conversión de grupo Método:

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

En Java que rara vez En cambio, creo que quiero hacer algo más que reemplazar un único método dentro de una clase interna anónima, por lo que las funciones anónimas en C# casi siempre funcionan igual de bien aquí.

Cuando portar código de Java a C#, es importante no tratar de preservar los idiomas Java - preservar los mismos objetivos, pero la migración a un lenguaje .NET, que en este caso está utilizando un delegado para representar una sola pieza de comportamiento de una manera abstracta.

0

Si desea utilizar/extender las clases existentes de Java podría implementar una clase de ayuda genérica:

class MyTimerTask: TimerTask 
{ 
    private Action action; 

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

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

A continuación, puede utilizar los métodos anónimos:

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

}), longTenSeconds); 

para tener la mejor experiencia en C# su proyecto, podría agregar un método de extensión. Crear una clase estática pública en alguna parte de su proyecto:

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); 
    } 
} 

continuación, puede utilizar el siguiente código: (La clase TimerHelper debe ser "visible" para el contexto de ejecución del método de extensión que se presenta, por lo tanto es pública)

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

}, longTenSeconds); 
Cuestiones relacionadas