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

Apache flex 为什么Flex允许我将类视为对象,apache-flex,actionscript-3,oop,Apache Flex,Actionscript 3,Oop,这段代码非常笨拙,因为它向数组中添加了一个类,然后试图将其作为对象进行拉取和操作 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.a

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

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]

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

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

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

能够在运行时检查类是一项强大的功能,也是.NET和Java中反射功能的基础。这些特性通常用于支持可扩展性模式或实现序列化框架


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

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

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

能够在运行时检查类是一项强大的功能,也是.NET和Java中反射功能的基础。这些特性通常用于支持可扩展性模式或实现序列化框架


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

后期绑定和动态语言的好处在于,它允许您在实现上有更大的灵活性。不利的一面是,这种语言不能保护您避免犯一些早期绑定和强类型所防止的简单错误。就我个人而言,我会考虑使用TDD测试驱动开发来帮助防止这些类型的错误蔓延到您的代码中。

后期绑定和动态语言的好处在于,它允许您在实现中有更大的灵活性。不利的一面是,这种语言不能保护您避免犯一些早期绑定和强类型所防止的简单错误。就我个人而言,我会考虑使用TDD测试驱动开发作为一种帮助,以防止此类错误蔓延到代码中。

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

在ActionScript中,您可以使用类完成两件主要的事情;您可以实例化它,并且可以访问它的静态属性。好吧,还有其他事情,但这些是显而易见的。实例化一个类可能是类作为值的最相关用途;类是自己的,就像你在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"

在ActionScript中,您可以将类作为值传递,并使用它来实例化该类。在java或C++语言中,你必须使用它作为泛型类的参数,或者定义一些普通的超类型的工厂类来做这个。

< p>这个问题在我看来相当于,为什么我可以用一个类作为一个值?这是个好问题

在ActionScript中,您可以使用类完成两件主要的事情;您可以实例化它,并且可以访问它的静态属性。好吧,还有其他事情,但这些是显而易见的。实例化一个类可能是类作为值的最相关用途;类是自己的,就像你在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"

在ActionScript中,您可以将类作为值传递,并使用它来实例化该类。在java或C++语言中,你必须使用它作为泛型类的参数,或者定义一些常用的超类型的工厂类。

看起来像Flex,集合不指定它们应该包含的值的类型。
var a:ArrayCollection = new ArrayCollection();
所以我觉得这是合乎逻辑的 编译器不会检查您添加到其中的值的类型。然后,只能在运行时检查集合元素中的赋值变量,因为编译器没有这些信息


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

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

var a:ArrayCollection = new ArrayCollection();
因此,我觉得编译器不检查添加到它的值的类型是合乎逻辑的。然后,只能在运行时检查集合元素中的赋值变量,因为编译器没有这些信息

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