代码之家  ›  专栏  ›  技术社区  ›  mway

AS3:将变量转换为动态类型

  •  2
  • mway  · 技术社区  · 14 年前

    是否可以将变量动态转换为类型,其中类型将是类型为的变量 Class

    考虑以下情况(无效):

    var myClass:Class = MyClass;
    var myInstance:myClass = new myClass();
    

    对于上下文:我正在Flex(4)中创建一个模态管理器,它将控制创建模态的各个方面(通过 PopUpManager )我想尽可能的减少。组件将通过相同的函数传递,而不是允许转换任何类型的变量,例如:

    var myInstance:* = new myClass();
    

    我宁愿尽可能地说清楚。假设这样做没有实际的好处,因为有检查来确保参数的类型 在分配之前-这比什么都重要。

    任何想法都是受欢迎的。

    编辑:我想我可以这样做:

    var myClass:Class = MyClass;
    var myInstance:* = new myClass() as myClass;
    

    3 回复  |  直到 14 年前
        1
  •  2
  •   BoppreH    14 年前

    我认为编译器不能处理动态类型。如果可以,就可以实现类似于泛型的特性。

    var myClass:Class = MyClass;
    var myObject:* = new myClass();
    
        2
  •  3
  •   Ryan    14 年前

    我不知道这和你现在的问题是不是一样。我需要一个有一个实现接口的子类。实现类可以是任何类型,但我需要保存和加载它的所有信息。

    public interface WindowChild {...}
    

    public class Window {
        public var child:WindowChild;
    }
    


    flash.utils.getQualifiedClassName(value:*):String
    文档中说:“返回对象的完全限定类名。” String your.packages::ClassName . 当 Window getQualifiedClassName(child) 有点像 my.packages.structure::MyImplementation
    注意,这不是接口的路径 WindowChild 而是我创建的实现该接口的类。

    当再次加载所有信息时,我使用了另一个Flash函数 . 这个函数“返回对name参数指定的类的类对象的引用” Object 但它将是 Class

    当时我只需要:

    var childClass:Class = getDefinitionByName(childClassName) as Class; //Child class name is what was returned from getQualifiedClassName(child)
    child = new childClass(); // This creates a new Object of what ever type childClass is
    

    此方法将保留运行时的类型检查,但您始终可以添加另一个中间步骤,以确保从 new childClass()

    希望这是有用的。

    干杯

        3
  •  0
  •   grapefrukt    14 年前

    我不这么认为。当我希望传入多个类型时,我会执行以下操作:

    public function doSomethingWithThis(something:Object):void {
        var button:Button = something as Button;
        var image:Image = something as Image;
        var list:List = something as List;
    
    
        if (button) {
    
    
        }
        else if (image) {
    
    
        }
        else if (list) {
    
    
        }
        else {
            throw new Error("This type of object will not work with this method.");
        }
    
    
    }