动作脚本中的虚拟关键字有什么作用?

时间:2010-02-12 00:09:19

标签: actionscript-3

我发现一些代码使用virtual关键字来表示函数,例如:

package tryOut{
    public class Parent {

        public function Parent() {}

        public function foo():void{
            trace("Parent foo");
        }//foo

        public virtual function bar():void{
            trace("Parent virtual bar");
        }//bar      
    }//class
}//package

据我所知,使用virtual关键字应该修改覆盖方法的方式,或者使用子方法的方式可行,或者其他方法。但它似乎什么都不做。有延伸:

package tryOut {
    public class Child extends Parent {
        public function Child() {}

        public override function foo():void {
            trace("Child foo");
        }//foo

        public override function bar():void {
            trace("Child virtual bar");
        }//bar

    }//class
}//package

以下代码打印:

var parent:Parent = new Parent();
var child:Child = new Child();

parent.foo(); //Parent foo
child.foo(); //Child foo
parent.bar(); //Parent virtual bar
child.bar(); //Child virtual bar

var childCast:Parent = child as Parent;

parent.foo(); //Parent foo
childCast.foo(); //Child foo
parent.bar(); //Parent virtual bar
childCast.bar(); //Child virtual bar

因此两种方法在覆盖方面的工作方式相同。 virtual关键字是否会更改我遗漏的内容?

2 个答案:

答案 0 :(得分:17)

从帮助文档中(如果您使用的是Flash,请搜索“虚拟”):

  

还有几个标识符   有时被称为   未来的保留词。这些   标识符不是由保留的   ActionScript 3.0,虽然其中一些   可以通过软件将其视为关键字   它包含ActionScript 3.0。   您可能可以使用其中许多   代码中的标识符,但Adobe   建议您不要使用它们   因为它们可能显示为关键字   该语言的后续版本。

abstract boolean byte cast

char debugger double enum

export float goto intrinsic

long prototype short synchronized

throws to transient type

virtual volatile

所以在AS3中,虚拟完全没有。

答案 1 :(得分:1)

  

因此两种方法在覆盖方面的工作方式相同。

是什么让你这么想?您展示的测试无法比较。

childCast被输入为Parent,但您仍然最终在Child中调用该函数。

您不会检查非虚方法的相同情况。