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?
答案 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的设计原因是什么?