2012-06-10 5 views
7

타이머/timertask 클래스의 사용을 위해 자바로 작성된 훌륭한 코드 예제를 찾았습니다. ...추상 클래스 인라인의 C# 구현을 작성 하시겠습니까?

현재 Android 용 'Mono'구현을 위해 C#으로 변환 중이지만 추상 클래스의 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를 (추상 클래스) 및 실행 방법 등에서 상속 된 클래스를 만들고 싶습니다 인라인 별도의 클래스를 만들 필요없이 (TimerTask 확장) 위의 Java 코드로 않습니다.

TimerTask를 상속하고 구현하기 위해 별도의 클래스를 생성하는 대신이 추상 클래스를 인라인으로 작성하는 C# 구문에 대해 조언 해 줄 사람이 있습니까?

답변

6

C#은 Java에서와 같이 인라인 클래스를 지원하지 않습니다. 익명 메소드는 정의 할 수 있지만 전체 클래스는 정의 할 수 없습니다. 따라서 추상 클래스를 구현하는 별도의 클래스를 정의해야합니다.

+0

아 ... 감사합니다. 왜 내가 이것에 대한 문서를 찾을 수 없는지 궁금해! 대런에게 감사드립니다. – Bonshaw

5

Darin이 말했듯이 익명의 기능이 여기로가는 길입니다. 1 비트의 비헤이비어만을 지정하려고하기 때문에 메서드가 Action을 수락하도록 만든 다음 호출자가 익명 함수 (익명 메서드 또는 람다 식)를 사용할 수 있습니다.

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

을 아니면 많은 코드가 있다면, 당신은 방법 그룹 변환을하는 방법을 사용할 것 : 호출 코드는 다음과 같을 것이다 자바 거의 I에서

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

어쨌든 익명의 내부 클래스 내에서 단일 메소드를 오버라이드하는 것 이상을 원한다. 그래서 C#의 익명 함수는 거의 항상 여기에서도 잘 작동한다. 같은 목표 유지하지만,이 경우 하나의 조각을 대표하는 대리자를 사용하는 .NET 관용구, 포팅 -

C#을 자바에서 코드를 포팅 할 때, 자바 숙어를 유지하려고하지 않는 것이 중요합니다

추상적 인 방식으로 행동의.

0

당신이 일반적인 헬퍼 클래스 구현할 수/사용하는 기존의 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);