as3继承变量

时间:2012-01-26 22:36:03

标签: actionscript-3 variables inheritance super

我有一个基类“Vehicle”和派生类“Car”。

package Game
{

    public class Vehicle
    {
        public var myVar = "vehicle";

        public function Vehicle()
        {
            trace("vehicle: " + myVar);
            DoSomethingWithMyVar();
        }

    }

}

package Game
{

    public class Car extends Vehicle
    {

        public function Car()
        {
            trace("car pre: " + myVar);
            myVar = "car";
            trace("car post: " + myVar);
            super();
        }

    }

}

基本上,我想在Car的构造函数中设置一个车辆属性,用super()调用Vehicle的构造函数,并让Vehicle基于myVar做一些事情。但这是我得到的输出:

car pre: null
car post: car
vehicle: vehicle

为什么myVar在调用基类构造函数时不保留“car”的值?我该如何正确实现?

1 个答案:

答案 0 :(得分:4)

变量初始化在超类中。在您实际拨打super();之前,它不会被初始化。这就是为什么在构造函数中执行任何其他操作之前应始终调用super()。事实上,在其他一些语言中,如Java,只允许对super()的调用作为子类构造函数中的第一个语句。

但是,您应该考虑在构造函数中使用初始化参数,而不是在声明中设置值 - 这是执行您想要执行的操作的更优雅和可维护的方式。

package game
{   
    public class Vehicle
    {
        public var myVar: String;

        public function Vehicle ( type:String = "vehicle" ) 
                             // new Vehicle() traces "vehicle"
        {
            trace("vehicle: " + type);
            myVar = type;
            doSomethingWithMyVar();
        }
    }
}

RESP。

public function Car ( type: String = "car" )
                             // new Car() traces "car"
{
    super( type );
}

另外,您可以随时拨打new Car("Porsche");或类似内容;)

P.S。另请注意:ActionScript中的命名约定建议使用以小写字母开头的名称包和方法。