2012-06-10 19 views
7

私は、タイマー/ timertaskクラスの使用のためにJavaで書かれたコードの素晴らしい例を見つけました...write c#抽象クラスのインライン実装?

私は現在、 'Mono for Android'の実装でこれをC#に変えていますが、私はC#でこれを実装すると抽象クラスのインライン実装TimerTaskを

// Here's the original java code 

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

、私は別々のクラスを作成することなく、TimerTaskを(抽象クラ​​ス)から継承したクラスと実行方法など、インラインを作成したいです(TimerTaskを拡張する)上記のJavaコードと同じです。

TimerTaskを継承して実装するために、この抽象クラスをインラインで作成する代わりに、別のクラスを作成する代わりに、C#の構文についてアドバイスしてもらえますか?

答えて

6

C#はJavaのようにインラインクラスをサポートしていません。匿名メソッドは定義できますが、クラス全体は定義できません。したがって、抽象クラスを実装する別のクラスを定義する必要があります。

+0

ああ、ありがたいです。なぜ私はこれのためのドキュメントを見つけることができなかったのだろうかと思った!答えダーリンありがとう。 – Bonshaw

5

ダーリン氏によれば、無名関数がここに行く方法です。 1ビットのビヘイビアを指定しようとしているだけなので、メソッドがActionを受け入れるようにしてから、呼び出し元は匿名関数(匿名メソッドまたはラムダ式)を使用できます。私はめったにJavaでは

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

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

それとも、コードの多くを持っていた場合、あなたはメソッドグループの変換では、この方法を使用したいと思います:呼び出し元のコードは次のようになりませんでしょうとにかく匿名の内部クラス内で単一のメソッドをオーバーライドする以上のことをしたいと思うので、C#の匿名関数はほとんど常にここでも同様に動作します。同じ目標保存するが、この場合には単一の部品を表現するために、デリゲートを使用している.NETのイディオム、への移植 -

JavaからC#にコードを移植する場合、それはJavaのイディオムを維持しようとしないことが重要です

抽象的な振る舞い

0

使用したい場合は/あなたは、一般的なヘルパークラスを実装することができ、既存のJavaクラスを拡張:

class MyTimerTask: TimerTask 
{ 
    private Action action; 

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

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

あなたはその後、匿名メソッドを使用することができます最高のC#の経験を持っているために

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

}), longTenSeconds); 

をあなたのプロジェクトでは、さらに拡張メソッドを追加することができます。その後、次のコードを使用することができます

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); 
関連する問題