[英]write c# implementation of abstract class inline?
我找到了一個很好的用java編寫的代碼示例,用於使用timer / timertask類...
我目前正在將其轉換為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中的內聯類。 您可以定義匿名方法,但不能定義整個類。 因此,您必須定義一個實現抽象類的單獨類。
正如達林所說,匿名功能是前往這里的方式。 您只是嘗試指定一點行為,因此只需讓方法接受一個Action
,然后調用者就可以使用匿名函數(匿名方法或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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.