2010-04-05 4 views
1

En AS3, si j'ai une classe telle:réglage actionscript 3 variables superclasse

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. 
} 
} 

et une sous-classe

public class superDude extends dude 
{ 

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

Cette tracera force de Superdude est 1. Je m'attendais à ce que la variable que j'ai définie dans la sous-classe (avant d'appeler le constructeur de la superclasse) reste.

Existe-t-il un moyen d'affecter des variables de classe dans les constructeurs de sous-classes qui ne sont pas écrasés par le constructeur de super-classe? Ou devrais-je les transmettre en tant que variables constructeurs?

Répondre

3

Vous appelez super() après avoir défini _strength sur 100; cette instruction va appeler le constructeur de la super classe qui va changer _strength en 1 (l'initialisation de la variable se passe dans le constructeur). Il n'y a aucun moyen d'empêcher cela et je pense que vous devriez appeler super() avant d'initialiser les variables.

1

Tout d'abord ... le constructeur super classe par défaut (qui ne prend aucun paramètre) est implicitement appelé par le constructeur de la sous-classe. Vous n'avez donc pas besoin de l'appeler explicitement.

Si le constructeur de la super-classe prend des paramètres, vous devez l'appeler explicitement et cet appel doit être la toute première instruction du constructeur de la sous-classe.

0

En réponse à la réponse de Kayes, je dois mentionner que "super" ne doit PAS toujours être appelé en premier.

Idéalement, les paramètres du constructeur doivent être copiés sur les variables d'instance du ASAP classe actuelle (à savoir avant d'appeler super), parce qu'ils peuvent doivent être disponibles à une méthode surchargée qui peut être appelé par le constructeur super classe. Si ces variables ne sont pas initialisées avant l'appel de super, elles ne seront pas disponibles pour la méthode surchargée. D'un autre côté, super devrait être appelé avant que vous ayez besoin d'accéder à des instances d'étape.

Il est donc correct d'initialiser les variables de la classe actuelle avant d'appeler super, mais il est incorrect d'initialiser les variables publiques/protégées de la classe super dans la sous-classe avant d'appeler super, car ils vont être remis à zéro lorsque super est appelé.

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 
    } 
}