2012-01-26 102 views
0

我有一個基類「Vehicle」和派生類「Car」。as3繼承變量

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(); 
     } 

    } 

} 

基本上,我想設置在汽車的構造車輛性能,車輛調用的構造超(),並有車輛時,基於myVar的東西。但這是我得到的輸出:

car pre: null 
car post: car 
vehicle: vehicle 

爲什麼myVar在調用基類構造函數時不保留「car」的值?我該如何正確實施?

+0

你可以多分享一下實際目標嗎? – 2012-01-26 22:47:31

回答

4

變量初始化在超類中。在您實際撥打​​之前,它不會被初始化。這就是爲什麼你應該在構造函數中做任何事情之前總是調用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");,或類似的東西;)

附:注意:ActionScript中的命名約定建議使用以小寫字母開頭的名稱來表示軟件包和方法。

+0

謝謝,我在最後使用super()而不是在開始時的原因是由於初始化的原因。我將從構造函數中分離初始化例程。 我沒有意識到命名約定(儘管我應該意識到所有現有的方法都是小寫的......)。再次感謝! – user1172362 2012-01-27 15:07:38