我应该为消息接收器创建接口吗?

时间:2012-03-06 09:04:58

标签: c# interface message messaging unity3d

在我使用(Unity)的游戏引擎中,每个游戏对象的基类都有一个方法'SendMessage(“methodName”)',它在每个与之关联的对象的每个类中调用指定的方法 - 如果它有一个。

我是否应该使用方法“methodName”创建一个新接口,以便我可以通过这种方式发送这种形式来进行这种交互,或者它只是额外的工作而没有任何收益?这似乎是一件好事,因为这样我将能够看到这个类可以从它的声明中接收到什么消息,但我看不出有什么错误,例如,我可以帮助避免这个。而且我也没有看到它以这种方式使用 - 所以可能它毕竟只是一种浪费的努力。

3 个答案:

答案 0 :(得分:2)

我应该使用接口而不是接受字符串并调用函数的方法吗?

优点:

  • 编制时间安全。 (耶!)。
  • 比反思更快(个人资料以确定这是否是合法的胜利)。

缺点:

  • 更多要编写的代码。

随意编辑更多优点/缺点。

我肯定会沿着查找具有所需接口(GetComponent<IInterface>GetComponent(typeof(IInterface)) as IInterface)的组件的路径,并以这种方式调用方法(即接口)。

答案 1 :(得分:2)

严格答案:是的,使用界面!现实回答:可能取决于。 通常以这种方式使用字符串是危险的(如果方法声明会改变怎么办?如果以错误的方式键入方法名称怎么办?你有任何安全问题吗?)。这些问题的答案总是:你会在运行时而不是编译时捕获这些问题(这意味着你可能会发布一些不起作用的东西,即使它是一种在编译时应该发现的错误 - 时间)。此外不要忘记表演,使用字符串你必须使用反射(我想/希望你不会有一个大的开关/案例声明)。 编写接口是繁琐的,但99%的时间是保持代码清洁和易于维护的最佳方法。 也就是说你可能需要使用那些字符串来调用方法(例如,我正在考虑Java代理或某种基于配置或消息内容的“动态”实例化)。 所以我想正确的答案是IT DEPENDS。我认为您应该始终使用接口,因为速度,错误检查,维护和安全问题(如果适用)。有时您可能需要使用文本消息,但是您应该小心使用它们,因为您将编写更少的代码(这绝不是选择一种方法而不是另一种方法的理由)。

附录:使用接口,您可以使用“服务守护程序”机制(例如基于IServiceProvider)来发现实现特定接口的所有工作站。使用SendMessage()实现相同的功能可能很棘手(你会使用CanHandlMessage()方法吗?)并且由于重复而容易出错。

实施例: 这只是一个例子(解释我对“服务守护进程”的意思,看看函数FindServices(),它检索实现给定接口的所有对象),我想你不会在你的高速游戏中使用LINQ和enumerables。我认为比带参数的SendMessage()更容易理解,而且很容易更新

interface IEnemy
{
 Point3D Position
 {
  get;
  set;
 }

 void Destroy();
}

void FireBomb(Bomb bomb, Point3D impactLocation)
{
 IEnumerable<IEnemy> affectedEnemies = 
  FindServices<IEnemy>.Where(x.Location - impactLocation <= bomb.BlastedArea);

 Execute(affectedEnemies, x => x.Destroy());
}

答案 2 :(得分:1)

如果你定义了接口IGolerkaEventHandler<T> {bool InvokeHandler(T param);},那么你可以让方法HandleGolerkaEvent<TT>(TT param)通过WeakReference列表,尝试将每个方法的目标转换为IGolerkaEventHandler<TT> ,并在每个演员投射的方法上调用InvokeHandler(param)。这将允许(要求)不同的“事件”类型接受不同的参数类型。在接口中将T定义为in参数可能有用也可能没有用,这取决于您是否希望有一些事件可以通过公共代码处理某些对象但是对于其他对象对象可能需要不同的处理。

相关问题