【问题标题】:Subscribing to an interface's events in C#在 C# 中订阅接口的事件
【发布时间】:2017-07-17 03:52:07
【问题描述】:

我正在创建一个游戏(在 Unity 中)。我希望输入处理与游戏逻辑分离,以便它可以跨平台。我有一个名为IInputHandler 的接口,可以在每个平台上以不同的方式实现。例如,

public class AndroidInputHandler : IInputHandler

public class PcInputHandler : IInputHandler

我想要这个界面的原因是我可以做这样的事情:

public class PlayerController {

     private IInputHandler _inputHandler;
     private Player _myPlayer;
     // ... 
     _inputHandler.ForwardKeyPressed += _myPlayer.MoveForward();

如您所见,我想要一个界面,我可以订阅它的方法,这样无论何时按下“前进”键,无论是 PC 上的“W”键还是 Android 屏幕上的点击,我的Player 向前移动。我曾尝试在我的IInputHandler 接口中使用delegates,但委托和接口似乎不能很好地配合使用。我怎样才能实现我想要做的事情?

编辑:我尝试过的:

public interface IInputHandler {

    event ForwardKeyPressed();

错误消息:“找不到类型或命名空间ForwardKeyPressed。”

【问题讨论】:

  • 你能展示一些关于这个问题的实际代码吗?您可以在接口中定义事件,然后根据需要完全使用它们
  • 当然。也许我只是不熟悉语法,但是当我尝试将以下方法放入我的界面时编译器会抱怨:event ForwardKeyPressed()。它说“找不到类型或命名空间ForwardKeyPressed”。
  • 请使用代码和确切的错误消息编辑问题。很可能只是语法问题
  • 您需要一些顶级代码来确定平台。在此代码中,您的按钮事件可以只是一个 if 语句来根据平台注册事件。
  • @jdweng 你误解了我的问题。我想知道如何在可以订阅的接口中编写方法。

标签: c# events interface delegates event-handling


【解决方案1】:

你必须为事件声明一个类型。

举个例子,

public interface IInputHandler 
{
    event EventHandler<ForwardKeyPressedEventArgs> ForwardKeyPressed;
}

【讨论】:

  • 为每个事件添加一个类型似乎太过分了。在那种情况下,我必须声明LeftKeyPressedEventArgsJumpKeyPressedEventArgsAbility1KeyPressedEventsArgs 等。没有更简单的方法吗?
  • @Alex 你可以使用EventHandler。或者,您可以为任何类型的按键事件声明一个名为 KeyPressedEventArgs 的类。由你决定。您归结为语法错误的基本问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多