2012-01-26 11 views
0

私は基底クラス "Vehicle"と派生クラス "Car"を持っています。 as3継承変数


package Game 
{ 

    public class Car extends Vehicle 
    { 

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

    } 

} 

package Game 
{ 

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

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

    } 

} 

は基本的に、私は車のコンストラクタの車両プロパティを設定したい、スーパーに車のコンストラクタ()を呼び出し、車両がmyVarに基づいて何かを持っています。しかし、これは私が手に出力されます。基底クラスのコンストラクタが呼び出されたときに

car pre: null 
car post: car 
vehicle: vehicle 

なぜmyVarには、「車」の値を保持しないのですか?これを正しく実装するにはどうしたらいいですか?

+0

実際の目標についてもう少し分かち合うことができますか? –

答えて

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");、またはそのような何かを呼び出すことができます;)

P.S.副題:ActionScriptの命名規則では、パッケージとメソッドの両方で小文字で始まる名前を使用することをお勧めします。

+0

おかげさまで、初期段階ではなく、最後にsuper()を使用したのは、初期化のためです。初期化ルーチンをコンストラクタから分離します。 私は命名規則に気づいていませんでした(ただし、既存のすべてのメソッドが小文字であることに気がつきましたが...)。再度、感謝します! – user1172362