2011-09-24 15 views

Respuesta

28

Si el flash no detecta una llamada a super() en su constructor niño entonces flash implícitamente llamada super()antes constructor de su hijo. Por lo tanto:

public class Parent { 
    public function Parent() { 
     trace("Parent"); 
    } 
} 

public class Child extends Parent { 
    public function Child() { 
     trace("Child"); 
    } 
} 

new Child(); 
// Parent 
// Child 

Así que su constructor niño en esencia se parece a esto

public function Child() { 
     super(); // <-- Added by flash! 
     trace("Child"); 
    } 

Así que no, omitiendo una llamada explícita a super() no generalmente afectar negativamente a la clase de su hijo.

¿Por qué le gustaría llamar explícitamente al super()?

La primera razón es el flash generará solamente siempre automáticamente una llamada sin parámetros a super, lo que significa que si sus clases padre constructor requiere argumentos, entonces usted tendrá que llamar explícitamente con estos argumentos. Si omite la llamada super(args...) en este caso, obtendrá un error de compilación.

En segundo lugar, si incluso su padre tiene un constructor sin parámetros, puede usar super() para controlar el orden que ejecutan los constructores. Flash siempre insertará la llamada antes del constructor del niño. Entonces, si quieres cambiar ese orden. Luego

public class Child extends Parent { 
    public function Child() { 
     trace("Child"); 
     super() 
    } 
} 

lo haría en el orden inverso. O usted podría hacer:

public class Child extends Parent { 
    public function Child() { 
     // work before initilizing parent 
     super() 
     // work after initilizing parent 
    } 
} 

Por último, hay un camino muy oscuro para no llame a su constructor de los padres diciendo:

public class Child extends Parent { 
    public function Child() { 
     if(false) super() 
    } 
} 

ya que Flash ve que hay una llamada, no lo hace inserta uno. Sin embargo, debido a que detrás de un if (false) nunca se llama, por lo que la clase principal nunca se inicializa.

+0

Gracias por una gran respuesta! ¿Cómo conociste esa funcionalidad secreta (Súper inserción automática)? –

+4

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f30.html - En la sección denominada ** Métodos de constructor ** –

+1

¿Suprimir el constructor padre significa que ninguno de los constructores ancestrales recibe una llamada o simplemente la superclase inmediata? –

1

Puede excluir de forma segura la llamada al constructor base. Si no llama al super() en el constructor, el compilador agregará una llamada al constructor base sin argumentos.

4

Si no llama al super() explícitamente, Flash lo hará automáticamente antes de todos los demás códigos en su constructor.

Si llama al super() explícitamente, se llamará en la línea donde lo escribió.

Sin embargo, tenga en cuenta que no se puede establecer u obtener cualquier this o super propiedades o llamar a cualquiera de los métodos antes de la super clase se instancia

Cuestiones relacionadas