内联编写抽象类的 C# 实现
本文关键字:实现 抽象类 | 更新日期: 2023-09-27 18:36:39
我找到了一个用java编写的代码的很好的例子,用于使用计时器/计时器任务类...
我目前正在将其转换为"Mono for Android"实现的 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(抽象类)和 run 方法等内联创建一个继承的类,而不必像上面的 java 代码那样创建一个单独的类(扩展 TimerTask)。
谁能建议我使用 c# 语法内联创建这个抽象类,而不是创建一个单独的类只是为了继承和实现 TimerTask?
C# 不支持像 Java 那样的内联类。您可以定义匿名方法,但不能定义整个类。因此,您必须定义一个实现抽象类的单独类。
正如Darin所说,匿名函数是这里要走的路。您只是尝试指定一点行为,因此只需使该方法接受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);