gpt4 book ai didi

java - C#相当于创建实现接口(interface)的匿名类

转载 作者:搜寻专家 更新时间:2023-11-01 01:54:05 26 4
gpt4 key购买 nike

我最近开始使用 C#,我想找到与之等效的方法。我不知道这叫什么,所以我就简单地用代码告诉你。

使用 Java,我能够创建如下界面:

public interface Event {
public void execute();
}

然后像这样在方法的参数中传递这个接口(interface):

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();
}
}

编辑:我的问题是关于 TestEvent 类的 simulatEvent 方法,以及 C# 是否可以执行这样的操作。

我想知道是否有一种方法可以用 C# 做类似的事情(在 simulateEvent 方法中实例化接口(interface))以及它实际调用的是什么。谢谢!

最佳答案

Woof...好吧,请允许我概括一下:

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

在 C# 中,函数是一等公民,可以声明为 Delegates。 , Func<>s , 或 Action<>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 )——我们也可以在 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();
}
}

关于java - C#相当于创建实现接口(interface)的匿名类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15581737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com