2009-02-18 64 views
6

actionscript3.0中的所有对象都从Object类继承,但actionscript3.0编译器似乎不够聪明,无法理解这一点。为什么actionscript3.0类heirachy失败(有时)?

看看下面的代码:

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为Object).toString()所示的对象。如果我们不给变量赋一个数据类型,比如t22,那么这个问题永远不会遇到。为什么不能使actionscript3.0编译器重新定义t2,既是TestTwo又是Object?

+0

你是不是指第9行和第10行追踪“t22”变量而不是“t2”? – aaaidan 2009-02-18 02:10:33

+0

在你的例子中有几个拼写错误,但这个问题真的很有趣...... – 2009-02-18 09:14:41

回答

4

这是因为Object类的

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

所以如果你把TestTwo转换成Object,编译器知道这些方法将被实现。如果你不投射它,TestTwo不会继承这些方法,所以它们还没有被执行,并且会出错。

这是一个奇怪的一个!

0

类继承原型继承在AS3中是两个不同的东西。原型继承据我所知是为了与AS2/AS1向后兼容而包括的,原型继承提供了方法对于在您的示例中转换为Object类的变量。对象原型toString()方法,而不是对象。由于原型不在TestTwo类中,因此它没有toString()方法。如果toString()方法是通过类继承提供的,那么您的示例将会编译。

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

有谁知道为什么AS3这样设计的原因?