gpt4 book ai didi

c# - Java 等同于 C# 的委托(delegate)/事件 : Changing Event Invoked Code Dynamically

转载 作者:搜寻专家 更新时间:2023-11-01 01:18:33 27 4
gpt4 key购买 nike

我在 C# 中有一个简单的 Screen 类,它有一堆事件(具有相应的委托(delegate)),如 FadeOutEvent

我想将我的库移植到 Java,但我发现事件/委托(delegate)的机制非常笨拙。具体来说,我不能轻易编写如下代码:

if (someVar == someVal) {
this.FadeOutComplete += () => {
this.ShowScreen(new SomeScreen());
};
} else {
this.FadeOutComplete += () => {
this.ShowScreen(new SomeOtherScreen());
};
}

对于所有只使用 Java 的人来说,本质上,我提示的是无法将当前类中的事件处理方法动态地重新分配给其他东西,无需创建新类;好像如果我使用接口(interface),当前类必须实现接口(interface),我不能更改后面调用的代码。

在 C# 中,您的代码很常见:

  • 在构造函数中/早期,将一些事件处理程序代码分配给事件
  • 稍后在执行期间,完全删除该代码
  • 通常,将原始处理程序更改为不同的处理程序代码

策略模式可以解决这个问题(并且确实如此),尽管我需要额外的类和接口(interface)来做到这一点;在 C# 中,它只是一个声明事件/委托(delegate),我已经完成了。

没有内部/匿名类,有没有办法做到这一点?

编辑: 我刚看到 this SO question ,这可能会有所帮助。

最佳答案

大多数情况下,它是相反的:

this.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (someVar == someVal) {
showSomeScreen();
}
else {
showSomeOtherScreen();
}
}
});

但是您可以通过委托(delegate)给其他两个对象来执行类似于 C# 代码的操作:

private Runnable delegate;

// ...
this.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
delegate.run();
}
});

// ...
if (someVar == someVal) {
this.delegate = new Runnable() {
@Override
public void run() {
showSomeScreen();
}
};
}
else {
this.delegate = new Runnable() {
@Override
public void run() {
showSomeOtherScreen();
}
};
}

Delegates是很久以前微软为Java提出的,被Sun拒绝了。我不记得当时是否已经存在匿名内部类,或者是否选择了它们作为替代方案。

关于c# - Java 等同于 C# 的委托(delegate)/事件 : Changing Event Invoked Code Dynamically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7622992/

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