наследуемые переменные as3 - PullRequest
0 голосов
/ 27 января 2012

У меня есть базовый класс «Автомобиль» и производный класс «Автомобиль».

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, вызвать конструктор Vehicleс super () и заставьте Vehicle сделать что-то на основе myVar.Но это вывод, который я получаю:

car pre: null
car post: car
vehicle: vehicle

Почему myVar не сохраняет значение "car" при вызове конструктора базового класса?Как я должен реализовать это правильно?

1 Ответ

4 голосов
/ 27 января 2012

Инициализация переменной в суперклассе. Он не будет инициализирован, пока вы на самом деле не наберете 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();
        }
    }
}

соответственно.

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

плюс, вы всегда можете позвонить new Car("Porsche"); или что-то в этом роде;)

P.S. На заметку: Соглашения об именах в ActionScript рекомендуют использовать имена, начинающиеся со строчной буквы как для пакетов, так и для методов.

...