2012-06-10 17 views
7

Ho trovato un grande esempio di codice scritto in java per l'uso di un timer di classi/TimerTask ...scrivere C# implementazione della classe astratta inline?

Attualmente sto trasformarla in C# per un 'Mono per Android' implementazione, ma avendo problemi con la conversione del implementazione in linea della classe TimerTask astratta

// Here's the original java code 

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

Quando a implementare questo in C#, vorrei creare una classe ereditata dalla TimerTask (classe astratta) e il metodo run ecc linea senza dover creare una classe separata (estendendo TimerTask) come fa il codice java sopra.

Qualcuno mi può consigliare sulla sintassi C# per creare questa classe astratta inline invece di creare una classe separata solo per ereditare e implementare TimerTask?

risposta

6

C# non supporta le classi inline come in Java. È possibile definire metodi anonimi ma non intere classi. Quindi dovrai definire una classe separata che implementa la classe astratta.

+0

Ah ... OK, grazie per quello. Mi sono chiesto perché non riuscissi a trovare la documentazione per questo! Grazie per la risposta Darin. – Bonshaw

5

Come dice Darin, una funzione anonima è il modo per andare qui. Stai solo cercando di specificare un bit di comportamento, quindi basta che il metodo accetti uno Action e che il chiamante possa utilizzare una funzione anonima (un metodo anonimo o un'espressione lambda). Il codice chiamante sarebbe simile a questa:

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

Oppure, se hai avuto un sacco di codice, che ci si vuole utilizzare un metodo, con una conversione metodo di gruppo:

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

In Java raramente trovo che voglio fare di più che scavalcare un singolo metodo all'interno di una classe interna anonima, quindi le funzioni anonime in C# funzionano quasi sempre altrettanto bene qui.

Quando il porting di codice da Java a C#, è importante non cercare di preservare idiomi Java - preservare gli stessi obiettivi, ma il porting di un idioma NET, che in questo caso sta usando un delegato per rappresentare un unico pezzo di comportamento in modo astratto.

0

Se si desidera utilizzare/estendere le classi Java esistenti si potrebbe implementare una classe generica di supporto:

class MyTimerTask: TimerTask 
{ 
    private Action action; 

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

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

È quindi possibile utilizzare i metodi anonimi:

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

}), longTenSeconds); 

di avere la migliore esperienza di C# in il tuo progetto, potresti aggiungere ulteriormente un metodo di estensione. Creare una classe public static qualche parte nel progetto:

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

quindi è possibile utilizzare il seguente codice: (La classe TimerHelper deve essere "visibile" al contesto di esecuzione per il metodo di estensione di presentarsi, quindi è pubblica)

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

}, longTenSeconds); 
Problemi correlati