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

    }

}

По сути, я хочу установить свойство транспортного средства в конструкторе Car, вызвать конструктор Vehicle с помощью super() и заставить Vehicle сделать что-то на основе myVar. Но это результат, который я получаю:

car pre: null
car post: car
vehicle: vehicle

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


person user1172362    schedule 26.01.2012    source источник
comment
Можете ли вы рассказать немного больше о фактической цели?   -  person Amy Blankenship    schedule 27.01.2012


Ответы (1)


Инициализация переменной находится в суперклассе. Он не будет инициализирован, пока вы не вызовете 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 рекомендуют использовать имена, начинающиеся со строчной буквы, как для пакетов, так и для методов.

person weltraumpirat    schedule 26.01.2012
comment
Спасибо, причина, по которой у меня было super() в конце, а не в начале, заключалась в инициализации. Я отделю процедуру инициализации от конструктора. Я не знал о соглашении об именах (хотя я должен был понять, что все существующие методы написаны строчными буквами...). Спасибо еще раз! - person user1172362; 27.01.2012