代码之家  ›  专栏  ›  技术社区  ›  Kevin Beck

为什么Flex允许我将类视为对象

  •  1
  • Kevin Beck  · 技术社区  · 17 年前

    这段代码非常笨拙,因为它向数组中添加了一个类,然后试图将其作为对象进行拉取和操作。

    private function fail(event:Event):void
    {
        var myObj:MyClass;
        var a:ArrayCollection = new ArrayCollection();
        var x:MyClass;
        var y:MyClass;
    
        myObj = new MyClass;
        a.addItem(myObj);
        a.addItem(MyClass);  // !!BAD!!
    
        x = a[0];
        y = a[1];
    }
    

    TypeError: Error #1034: Type Coercion failed: cannot convert com.ibm.ITest::MyClass$ to com.ibm.ITest.MyClass.
        at ITest/fail()[C:\work_simple01\ITest\src\ITest.mxml:51]
        at ITest/___ITest_Button5_click()[C:\work_simple01\ITest\src\ITest.mxml:61]
    

    所以我的问题是,为什么这条线被标记了!!令人不快的甚至比允许的还要高?我预计这里会出现编译时错误。因为它是编译的,所以我不知道它有什么用处。这是怎么一回事?

    4 回复  |  直到 17 年前
        1
  •  8
  •   Jesse Millikan    15 年前

    在我看来,这个问题相当于“为什么我可以使用类作为值?”这是一个好问题。

    实例化 它,你可以 当然。(好的,还有其他事情,但这些是显而易见的。)实例化类可能是类作为值最相关的用法;这个班是自己的 factory ,就像你在C++或java中明确说明的一样。

    下面是我作为练习写的一个小俄罗斯方块游戏的例子。我有两门课,砖块课和石板课。一块砖头是游戏中的砖头,会掉落并堆积起来。布景砖是一块刚被画进游戏区框架的砖。

    但是,我使用了一个函数来绘制这两个函数,而没有引用函数中的任何一种类型:

    function drawBricks(xs:Array, ys:Array, brickType:Class){
     xs.map(function(o,i,a){
      var brick = new brickType();
      // etc.
     });    
    }
    

    我可以这样使用它:

    drawBricks([0,1,2,3], [4,4,4,4], Brick); // draw a long piece
    drawBricks(times(0, 21), countFrom(0, 21), SceneBrick); // draw a big vertical "wall"
    

        2
  •  7
  •   Rob Walker    17 年前

    我假设异常发生在示例的最后一行,而不是您标记为“坏”的错误。

    您添加到数组中的是表示类“MyClass”的对象,而不是MyClass的实例。

    所以操纵其中一个对象是一件有效的事情。。。因为它不是MyClass的实例,所以不能将其分配给y变量。

        3
  •  1
  •   Sébastien RoccaSerra    17 年前

    在Flex中,集合似乎没有指定它们应该包含的值的类型。

    var a:ArrayCollection = new ArrayCollection();
    

    对于作为对象(并响应消息)的类,构建各种调试/检查/反射工具非常方便。

        4
  •  0
  •   tvanfosson    17 年前

    推荐文章