установка Actionscript 3 переменные суперкласса - PullRequest
1 голос
/ 05 апреля 2010

В AS3, если у меня есть класс такой:

public class dude
{
//default value for a dude
protected var _strength:Number = 1; 
public function dude( ):void
{    super( );
     //todo... calculate abilities of a dude based on his strength.
}
}

и подкласс

public class superDude extends dude
{

public function superDude( ):void
{
   _strength = 100;
   super( );
   trace( "strength of superDude: " + _strength );
}
}

Это будет отслеживать сила superDude составляет 1 . Я ожидал, что переменная, которую я установил в подклассе (до вызова конструктора суперкласса), останется.

Есть ли способ присваивать переменные класса в конструкторах подкласса, которые не перезаписываются создателем суперкласса? Или я должен передать их в качестве переменных конструктора?

Ответы [ 3 ]

4 голосов
/ 05 апреля 2010

Вы вызываете super () после установки _strength на 100; эта инструкция будет вызывать конструктор из суперкласса, который изменит обратно _strength на 1 (инициализация переменной происходит в конструкторе). Нет никакого способа предотвратить это, и я думаю, что вы должны вызвать super () перед инициализацией переменных.

1 голос
/ 06 апреля 2010

Прежде всего .. конструктор суперкласса по умолчанию (который не принимает никаких параметров) неявно вызывается из конструктора подкласса. Так что вам не нужно называть это явно.

Если конструктор суперкласса принимает параметры, вам нужно явно вызвать его, и этот вызов должен быть самым первым оператором в конструкторе подкласса.

0 голосов
/ 15 января 2014

В ответ на ответ Кейса я должен упомянуть, что «супер» НЕ всегда следует называть первым.

В идеале, параметры конструктора должны быть скопированы в переменные экземпляра класса current как можно скорее (т. Е. Перед вызовом super), поскольку они могут быть необходимы для переопределенного метода, который может вызываться суперклассом конструктор. Если эти переменные не инициализированы до вызова super, они не будут доступны для переопределенного метода. С другой стороны, super должен быть вызван до того, как вам понадобится доступ к любым экземплярам сцены.

Поэтому правильно инициализировать переменные класса current перед вызовом super, но неправильно инициализировать открытые / защищенные переменные класса super в подклассе перед вызовом super, потому что они будут сброшены при вызове super.

public class GUIControlSubclass extends GUIControl
{
    private var _param:String;
    public function GUIControlSubclass( param:String )
    {
        _param = param; //variable of this class must be assigned before calling super, so it's available to override of initLayout
        _backgroundColor = 0xffffff; //it is incorrect to assign protected/public variable of super class here, since it will be reset by super call
        super(); //super class constructor will call initLayout, which will call this subclass's override of it; super class constructor itself should call it's own "super" method *before* calling initLayout, to ensure stage instances are constructed and available to initLayout
    }

    override protected function initLayout():void
    {
        super.initLayout();
        //IF _param WAS NOT SET **BEFORE** CALLING SUPER IN THE CONSTRUCTOR, ITS VALUE WOULD BE NULL HERE, SINCE SUPER TRIGGERS THIS METHOD, THEREFORE _param MUST BE ASSIGNED BEFORE SUPER IS CALLED
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...