【问题标题】:c# Anonymous Interface Implementation [duplicate]c#匿名接口实现
【发布时间】:2018-08-07 08:35:32
【问题描述】:

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

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

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

提前致谢! -克里斯

编辑: 我不想专门做一个新线程。这是一个更普遍的问题,关于在 C# 中从 Java 执行匿名实现之类的正确方法。这不是关于那个具体的例子。

【问题讨论】:

  • 有没有办法在 C# 中做到这一点? - 没有。
  • 使用ThreadStart 代表Runnable 实现(相关问题here)。请注意,C# 不支持匿名接口实现,您需要创建具体的类并在其中定义所有方法。

标签: java c# interface anonymous


【解决方案1】:

执行此操作的一般方法是 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();
    };
}

【讨论】:

    【解决方案2】:

    您之前可能已经搜索过此内容,现在答案是:没有。现在在 C# 中
    但我认为您的主要问题是为什么?

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

    详细回答:如果您想了解更多关于为什么它尚未添加到 C# 中的详细信息;在 GitHub 的 Roslyn (an open-source .Net complier) 页面中,此确切的功能请求下方有一个有用的对话。看看吧:https://github.com/dotnet/roslyn/issues/13

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 2015-09-30
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多