Sn0*_*bli 7 c# java anonymous interface
我已经多次看到这个问题,但我仍然不明白。在 Java 中,我可以这样做:
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("Hello");
}
}).start();
Run Code Online (Sandbox Code Playgroud)
在我看来,这是实现只使用一次的接口的一种非常好的方式。有没有办法在 C# 中做到这一点?我已经听说过委托,但这只能部分解决问题,因为我只能实现一种方法。如果我有多种方法,在 C# 中执行此操作的“正确”方法是什么?我是否必须为此实现另一个类?
提前致谢!-克里斯
编辑:我不想专门创建一个新线程。这是关于在 C# 中从 Java 执行匿名实现之类的正确方法的更普遍的问题。这不是关于那个具体的例子。
执行此操作的一般方法是 C# 是创建您自己的私有类。正如您所指出的,C# 中的其他方法(委托/lambda)仅在接口只有一种方法(即 Java 函数式接口)时才有效:
爪哇:
void testMethod()
{
x = new ISomeInterface(){
@Override
public void method1() { foo(); }
@Override
public void method2() { bar(); }
};
}
Run Code Online (Sandbox Code Playgroud)
C#:
void testMethod()
{
x = new ISomeInterfaceAnonymousInnerClass();
}
private class ISomeInterfaceAnonymousInnerClass : ISomeInterface
{
public void method1()
{
foo();
}
public void method2()
{
bar();
}
}
Run Code Online (Sandbox Code Playgroud)
当涉及到 Java 函数式接口时,这是最简单的转换:
爪哇:
@FunctionalInterface
interface ISomeInterface
{
void method();
}
void testMethod()
{
x = new ISomeInterface(){
@Override
public void method() { foo(); }
};
}
Run Code Online (Sandbox Code Playgroud)
C#:
delegate void ISomeInterface();
void testMethod()
{
x = () =>
{
foo();
};
}
Run Code Online (Sandbox Code Playgroud)