我有一个基类“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”的值?我该如何正确实现?
答案 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中的命名约定建议使用以小写字母开头的名称包和方法。