【问题标题】:Creating an instance of a class that implements an interface based on the class name?创建基于类名实现接口的类的实例?
【发布时间】:2011-02-17 16:14:09
【问题描述】:

有没有办法根据类的名称生成实现接口的类的实例?

我正在尝试:

var ClassReference:Object = getDefinitionByName("movement.OuterSpaceMovement") as IMovement;
var m:IMovement = new ClassReference as IMovement;
trace("startup..." + m);

-但我收到一条错误消息 ReferenceError: Error #1065 (OuterSpaceMovement) not defined。

我有几个实现相同接口的类 (IMovement),但我需要能够生成这些类的新实例,然后将这些实例作为数据类型 (IMovement 数据类型) 传递给其他类...

然后我尝试了:

var ClassReference:Class = getDefinitionByName("OuterSpaceMovement") as Class;
var m:IMovement = new ClassReference() as IMovement;

这似乎不起作用......但是以下

var m:IMovement = new OuterSpaceMovement();

会吗??

【问题讨论】:

    标签: flash actionscript-3 reflection interface


    【解决方案1】:

    你的 ClassReference 应该是 Class 类型,所以:

    var ClassReference:Class = getDefinitionByName("movement.OuterSpaceMovement") as Class;
    var m:IMovement = new ClassReference() as IMovement;
    

    这应该可以工作,除非类定义有问题(它必须包含在构建中,因此您必须在程序中的某个位置至少导入一次 OuterSpaceMovement,或者将其显式包含在构建设置或编译器选项中)。

    当然,OuterSpaceMovement 必须实现 IMovement。 ;)

    【讨论】:

    • 谢谢,这确实有帮助,但我仍然收到“未定义”错误消息...在上面添加了一些细节。谁能解释一下有什么区别??
    • 就像我说的:您必须在某个时候包含该类,以便 getDefinitionByName() 找到它。 new OuterSpaceMovement(); 是明确的:编译器导入类文件,因为它“知道”需要该类。当您按名称调用类时,没有显式引用,您必须手动确保编译器包含类定义 - 如果它不存在,则在运行时找不到它! new OuterSpaceMovement() 实际上可以在您的程序中的任何位置 - 然后 getDefinitionByName() 调用也可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多