编写抽象类内联的c#实现?
我发现了一个很好的用java编写的使用定时器/定时器任务类的代码示例 我目前正在将其转换为c#,用于“Mono for Android”实现,但在转换抽象类TimerTask的内联实现时遇到了麻烦编写抽象类内联的c#实现?,c#,android,mono,abstract-class,C#,Android,Mono,Abstract Class,我发现了一个很好的用java编写的使用定时器/定时器任务类的代码示例 我目前正在将其转换为c#,用于“Mono for Android”实现,但在转换抽象类TimerTask的内联实现时遇到了麻烦 // Here's the original java code private void resetMapChangeTimer() { mChangeDelayTimer.schedule( new 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中的内联类。您可以定义匿名方法,但不能定义整个类。因此,您必须定义一个单独的类来实现抽象类。正如Darin所说,匿名函数是实现这个抽象类的方法。您只尝试指定一点行为,因此只需让方法接受
操作
,然后调用方就可以使用匿名函数(匿名方法或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);