当前位置: 首页 > 面试题库 >

C#等效于创建实现接口的匿名类

皇甫展
2023-03-14
问题内容

我最近开始使用C#,并且我想找到与此等效的方法。我不知道这叫什么,所以我将简单地通过代码向您展示。

使用Java,我能够创建如下接口:

public interface Event {
    public void execute();
}

并像下面这样在方法的参数中传递此接口

public class TestEvent {
    ArrayList<Event> eventList = new ArrayList<Event>();

    public void addEvent(Event event){
        eventList.add(event);
    }

    public void simulateEvent(){
        addEvent(new Event() {
            public void execute(){
                //functionality
            }
        } );
    }

    public void processEvents(){
        for(Event event : eventList)
            eventList.execute();
    }
}

编辑 :我的问题是关于类中的simulatEvent方法的TestEvent,如果使用C#可以执行这样的操作。

我想知道是否有一种方法可以使用C#(在simulateEvent方法中实例化接口)执行类似的操作,以及这实际上是什么。谢谢!


问题答案:

哇…好吧,请允许我概括一下:

因此,在Java中,您需要一种方法来传递函数。Java本质上不支持以一等公民身份使用函数,这是实现 匿名类的 背后原因之一-
打包的函数组可以内联声明并(作为接口)传递给方法/其他类,然后再调用这些函数。

在C#中,函数是一等公民,可以声明为DelegatesFunc<>sAction<>s。让我们尝试一下比较:

某种Java-y构造(我的Java相当老,请耐心等待):

public interface IDoSomething {
    public int Return42();
    public bool AmIPrettyOrNot(string name);
    public void Foo();
}

public void Main(String[] args) {
    DoStuff(new IDoSomething() {
        public int Return42() { return 42; }
        public bool AmIPrettyOrNot(string name) { return name == "jerkimball"; }
        public bool Foo(int x) { ... }
    });
}

public void DoStuff(IDoSomething something) { ... }

C#中的(非常粗糙)等效项为:

public void Main(string[] args)
{
    Func<int> returns42 = () => 42;
    Func<string,bool> amIPretty = name => name == "jerkimball";
    Action<int> foo = x => {};
}

现在,正如其他人提到的那样,在处理事件时,通常会在Java端看到这种模式-同样在C#端:

 public class Foo 
 {
     // define the shape of our event handler
     public delegate void HandlerForBarEvent(object sender, EventArgs args);
     // declare our event
     public event HandlerForBarEvent BarEvent;

     public void CallBar()
     {
         // omitted: check for null or set a default handler
         BarEvent(this, new EventArgs());
     }
 }

 public void Main(string[] args)
 {
      var foo = new Foo();
      // declare the handler inline using lambda syntax
      foo.BarEvent += (sender, args) => 
      {
           // do something with sender/args
      }
      foo.CallBar();
 }

注意,我们也可以给它一些具有相同“形状”的东西:

 public void MyHandler(object sender, EventArgs args)
 {
     // do stuff
 }
 public void Main(string[] args)
 {
      var foo = new Foo();
      // that method above is the same "shape" as HandlerForBarEvent
      foo.BarEvent += MyHandler;
      foo.CallBar();
 }

但是在Java中,它也用于定义内存(例如Runnable)服务时Thread的功能-我们也可以在C#中做到这一点:

var thread = new Thread((Action)(() => 
     {
         // I'm the threads "run" method!
     });
thread.Start();

现在,其他内容-枚举:

public void processEvents(){
    for(Event event : eventList)
        eventList.execute();
}

C#的想法相同,只是调用方式不同:

public void processEvents()
{
    // edit: derp, 'event' is a keyword, so I'm
    // renaming this, since I won't get into why
    // you could also use @event...
    foreach(var evt in eventList)
    {
        evt.Execute();
    }
}


 类似资料:
  • 问题内容: 我已经阅读了“ C#匿名实现接口(或抽象类) ”线程以匿名实现接口。但是我想知道使用委托或任何类似方法的.NET 2.0(NO LINQ)是否也可能实现 我从JAVA知道以下可能: (我希望我还记得,是一段时间以前我使用JAVA,但我想它是类似的东西)。每当方法需要接口的实例并且仅被调用一次时,这可能会有所帮助,因此无需为此单一方法创建新的类。 问题答案: .NET 2.0还支持匿名委

  • 问题内容: 在C#中,您可以执行以下操作: 是否有与此等效的Java? 问题答案: Java没有通过关键字向C#提供类型推断,因此尽管您可以创建匿名类型,但由于无法获取其属性,它们的效果不是很好。 因此,您可以像这样创建一个匿名类的实例: 但是由于是您无法在代码中访问的实例,并且已经创建了 匿名 类的实例,因此根据定义,没有办法显式引用该类。 在C#中,可以通过推断类型来解决此问题,但是在Java

  • 问题内容: 在Java中,可以扩展带有匿名类的接口,该类可以动态实现。例: (更多信息:http : //www.techartifact.com/blogs/2009/08/anonymous-classes-in-java.html#ixzz1k07mVIeO) 这在C#中可能吗?如果不是,那么有什么可行的替代方法而不必依赖于实现过多的子类? 问题答案: 不,您不能在C#中做到这一点-但通常,

  • 问题内容: 我有一个第三方Java库,该对象的接口如下: 我如何像Java匿名类一样在Kotlin中简洁地实现它: 问题答案: 假设接口只有一种方法,则可以使用SAM 如果您有一个接受处理程序的方法,那么您甚至可以忽略类型参数: 如果接口具有多个方法,则语法会更加冗长:

  • 本文向大家介绍Kotlin 创建接口或者抽象类的匿名对象实例,包括了Kotlin 创建接口或者抽象类的匿名对象实例的使用技巧和注意事项,需要的朋友参考一下 一 ,定义接口和抽象类 二,创建对应的匿名对象 补充知识:android Kotlin 继承、派生、接口、构造方式,方法、属性重写 前言 kotlin 作为google官方android 开发语言,大势所趋,据传到2018底kotlin要全面替

  • 问题内容: 在C#中,您可以匿名定义委托(即使它们不过是语法糖)。例如,我可以这样做: 是否可以在Java中传递这样的代码?我正在使用处理框架,该框架具有Java的较旧版本(它没有泛型)。 问题答案: Java 8之前的版本: 最接近委托的Java是单方法接口。您可以使用匿名内部类。 Java 8及更高版本: Java 8 在该语言中添加了lambda表达式。