c#匿名接口实现

时间:2018-08-07 08:35:33

标签: java c# interface anonymous

我已经看过几次这个问题,但是我还是不明白。 在Java中,我可以这样做:

new Thread(new Runnable(){
  @Override
  public void run() {
    System.out.println("Hello");
  }
}).start();

在我看来,这是实现接口的一种非常好的方法,该接口的实现只使用一次。有没有办法在C#中做到这一点? 我已经听说过代表,但是那只能解决部分问题,因为我只能实现一种方法。如果我有多种方法,在C#中执行此操作的“正确”方法是什么?我必须为此实现另一个类吗?

预先感谢! -克里斯

编辑: 我不想专门创建一个新线程。这是一个关于使用C#从Java进行匿名实现的正确方法的更普遍的问题。并不是那个特定的例子。

2 个答案:

答案 0 :(得分:0)

可能您以前已经搜索过此答案,答案是:否。没用C#
但我认为您的主要问题是为什么?

简短回答:可以在接下来的C#版本中设计为功能。这绝对是可能

详细答案::如果您想了解有关为何尚未将其添加到C#中的更多详细信息,请参见:在GitHub Roslyn (an open-source .Net complier)页上的确切的功能请求下,有一个有用的对话。签出:https://github.com/dotnet/roslyn/issues/13

答案 1 :(得分:0)

执行此操作的一般方法是C#是创建自己的私有类。如您所述,C#中的其他方法(委托/ lambda)仅在接口只有一种方法(即Java功能接口)时才起作用:

Java:

void testMethod()
{
    x = new ISomeInterface(){
        @Override
        public void method1() { foo(); }
        @Override
        public void method2() { bar(); }
        };
}

C#:

void testMethod()
{
    x = new ISomeInterfaceAnonymousInnerClass();
}

private class ISomeInterfaceAnonymousInnerClass : ISomeInterface
{
    public void method1()
    {
        foo();
    }
    public void method2()
    {
        bar();
    }
}

这是涉及Java功能接口时最简单的转换:

Java:

@FunctionalInterface
interface ISomeInterface
{
    void method();
}

void testMethod()
{
    x = new ISomeInterface(){
        @Override
        public void method() { foo(); }
        };
}

C#:

delegate void ISomeInterface();

void testMethod()
{
    x = () =>
    {
        foo();
    };
}