为什么actionscript 3.0类层次结构失败(有时)?

时间:2009-02-18 02:01:17

标签: actionscript-3 oop

actionscript3.0中的所有对象都继承自Object类,但actionscript3.0编译器似乎不够聪明,无法理解这一点。

看看以下代码:

package{
   public class TestOne{
      public function TestOne(){
        var t2: TestTwo = new TestTwo();
        trace(t2.toString()); // COMPILE TIME ERROR
        trace((t2 as Object).toString(); // [object TestTwo]

        var t22 : * = new TestTwo();
        trace(t22.toString()); // [object TestTwo]
        trace((t22 as Object).toString(); // [object TestTwo]
      }
   }
}
class TestTwo{}

t2.toString()给出编译时错误,因为数据类型t2不包含 toString()。但是,t2确实包含 toString(),因为它是(t2 as Object).toString()所示的对象。如果我们不给变量一个数据类型,比如t22,那么问题永远不会遇到。为什么actionscript3.0编译器无法重新启动t2是TestTwo和Object?

2 个答案:

答案 0 :(得分:4)

这是因为

  

Object类的方法是   在Object上动态创建   原型。要重新定义此方法   Object的子类,不要使用   覆盖关键字。例如,a   Object的子类实现了函数   toString():String而不是使用   覆盖基类。

因此,如果将TestTwo转换为Object,编译器将知道将实现这些方法。如果您不进行强制转换,TestTwo不会继承这些方法,因此它们尚未实现并且会出错。

这有点奇怪!

答案 1 :(得分:0)

类继承原型继承是AS3中的两个不同的东西。原型继承是我所理解的,因为它向后兼容AS2 / AS1,而它的原型继承为你的示例中的Object类提供了toString()方法。 Object prototype 具有toString()方法,而不是Object 。由于原型在TestTwo类中不存在,因此它没有toString()方法。如果通过类继承提供toString()方法,那么您的示例将进行编译。

从技术上讲,你的语句“actionscript3.0中的所有对象都继承自Object类”并不完全正确,因为原型继承和类继承之间存在差异。原型继承是一种在脚本语言中发现的有点深奥的OO概念。

有谁知道AS3的设计原因是什么?