Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 为什么actionscript3.0类继承失败(有时)?_Actionscript 3_Oop - Fatal编程技术网

Actionscript 3 为什么actionscript3.0类继承失败(有时)?

Actionscript 3 为什么actionscript3.0类继承失败(有时)?,actionscript-3,oop,Actionscript 3,Oop,actionscript3.0中的所有对象都继承自对象类,但actionscript3.0编译器似乎不够聪明,无法理解这一点 请看下面的代码: package{ public class TestOne{ public function TestOne(){ var t2: TestTwo = new TestTwo(); trace(t2.toString()); // COMPILE TIME ERROR trace((t2

actionscript3.0中的所有对象都继承自对象类,但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(),因为它是一个对象as(t2as object)。如果我们不给变量一个数据类型,比如t22,那么就永远不会遇到问题。为什么actionscript3.0编译器不能重新确认t2既是TestTwo又是Object?

这是因为

对象类的方法是 在对象的 原型。要在中重新定义此方法,请执行以下操作: 对象的子类,不要使用 覆盖关键字。例如,一个 对象的子类实现函数 toString():字符串而不是使用 基类的重写

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


这有点奇怪

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

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


有人知道AS3设计成这样的原因吗?

你的意思是让第9行和第10行跟踪“t22”变量而不是“t2”?在你的示例中有几个输入错误,但问题真的很有趣……确切地说,它是按照字母顺序继承的,而toString不是要继承的类方法,在原型物体上。AS3确实非常严格地遵循类继承,因此,如果您发现一种您认为不符合的情况,那么很可能是您缺少了一些东西,而不是编译器!