Actionscript 3 AS3智能型定义

Actionscript 3 AS3智能型定义,actionscript-3,game-engine,Actionscript 3,Game Engine,我正在AS3中开发一个基于组件的引擎,我在game object中有一个函数,它根据组件的类型返回一个组件: gameObject.Has(Body); //This will return a reference to the gameobjects body component 我遇到的问题是访问组件。要做到这一点,我必须这样做: Body(gameObject.Has(Body)).SetVelocity(5); 有人有更好的方法吗 编辑: 您当前对Has()的返回类型有什么要求 如果

我正在AS3中开发一个基于组件的引擎,我在game object中有一个函数,它根据组件的类型返回一个组件:

gameObject.Has(Body); //This will return a reference to the gameobjects body component
我遇到的问题是访问组件。要做到这一点,我必须这样做:

Body(gameObject.Has(Body)).SetVelocity(5);
有人有更好的方法吗

编辑:


您当前对Has()的返回类型有什么要求

如果你喜欢避开类型检查。可以让Has()方法返回类型对象

public function Has():Object{
  ...
  return anObject;
}

#then you can call any prop/method without throwing type errors.
gameObject.Has(Body).SetVelocity(5)

然而,没有一种很好的方法可以在不强制转换var的情况下维护类型检查,您已经在示例代码中这样做了。

您的问题似乎在于您试图在实现中过于通用。这引入了两个可能的失败点:在“in”端,您可能会为您的身体加载一个非身体的BaseObject;在“out”端,您的游戏对象可能会返回一个非身体的对象(当前实现显然是类型安全的这一事实并不是给定的)

你知道,任何时候你调用一个真正通用的getter,你需要它返回一个特定类型的对象(因为你要调用它的方法),那么为什么不通过使用显式的getter和setter来简化你的工作呢

或者你可以得到完全荒谬的基本对象,并将其一般化,如:

gameObject.has(Body).callMethod('setVelocity').to(5);

在我们的项目中,我们也在做同样的事情。但我们还有另一种方法。我们的ObjectUtility中有一个实用程序类。该方法返回特定根对象下的所有对象

        public function collectObjectsByType(object:Object, type:Class, results:Array):void
    {

    }

我可以只显示方法结构。

是的,我考虑过这样做。我真的希望AS3有模板和预处理器指令。我也在考虑编写一个按类型索引的函数数组,但这似乎有些过分。在AS3中,我很少设置这样一个通用的m_组件数组。我想这是一种情况,你有许多不确定的对象,你正在跟踪或你试图写更少的代码。如果您想简化Body的处理,可以使用getter:
公共函数get Body():Body
来包装和强制转换该项。
        public function collectObjectsByType(object:Object, type:Class, results:Array):void
    {

    }