【问题标题】:Why does the actionscript3.0 class heirachy fail (sometimes)?为什么 actionscript 3.0 类层次结构会失败(有时)?
【发布时间】:2009-02-18 02:01:16
【问题描述】:

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?

【问题讨论】:

  • 您的意思是让第 9 行和第 10 行追踪“t22”变量而不是“t2”吗?
  • 你的例子中有几个错别字,但这个问题真的很有趣......

标签: actionscript-3 oop


【解决方案1】:

这是因为

Object 类的方法是 在对象上动态创建 原型。重新定义这个方法 Object 的子类,不要使用 覆盖关键字。例如,一个 Object 的子类实现功能 toString():String 而不是使用 覆盖基类。

因此,如果您将 TestTwo 转换为 Object,编译器就会知道这些方法将被实现。如果不强制转换,TestTwo 不会继承这些方法,因此它们没有被实现,会报错。

这有点奇怪!

【讨论】:

  • 没错,就是继承继承,toString不是要继承的类方法,它是在原型对象上的。 AS3 确实非常严格地遵循类继承,所以如果你发现你认为它不遵循的情况,很可能是你遗漏了一些东西,而不是编译器!
【解决方案2】:

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

所以从技术上讲,由于原型继承和类继承之间的区别,您的说法“actionscript3.0 中的所有对象都继承自 Object 类”并不完全正确。原型继承是脚本语言中的一个有点深奥的 OO 概念。

有谁知道AS3是这样设计的原因吗?

【讨论】:

    猜你喜欢
    • 2020-08-30
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多