Siempre llamo a super() cuando extiendo Sprite.
¿Pero no not calling super()
causa algún problema?
Hasta ahora, no tengo ningún problema y nunca he visto código que llame a super() en el constructor cuya clase extiende Sprite.
¿Qué tal TextField?
No tengo ningún problema sobre TextField, también.
¿Cómo saber si debo llamar a super() o no?¿No tengo que llamar a super() en el constructor cuando la clase extiende Sprite en actionscript3?
¿No tengo que llamar a super() en el constructor cuando la clase extiende Sprite en actionscript3?
Respuesta
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.
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.
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
- 1. ¿Tengo que llamar a [super init] o [super initWithCoder], etc. para NSObject
- 2. ¿Por qué llamar a super() en un constructor?
- 3. ¿Siempre tengo que llamar a [super viewDidLoad] en el método -viewDidLoad?
- 4. Llamar a super()
- 5. Java:. Cómo llamar a super() super() en el método reemplazado (método abuelos)
- 6. ¿Clase que se extiende?
- 7. Llamar a un constructor de la clase base desde la clase derivada en Java
- 8. Prepara el parámetro para el super constructor
- 9. ¿Tengo que llamar explícitamente a System.exit() en una aplicación Webstart?
- 10. Solución cuando super no puede ser la primera línea del constructor en java
- 11. Llamando super constructor en C#
- 12. Llamando al método de clase super super
- 13. clase interna que se extiende
- 14. ¿Cómo se intercepta el argumento del constructor de super clase?
- 15. se extiende de la clase con constructor privado
- 16. llamar al constructor de otro constructor en una misma clase
- 17. java force una clase que se extiende
- 18. Cómo resolver 'El super constructor implicit classA() no está visible. Debe invocar explícitamente a otro constructor '?
- 19. Llamar a un constructor de otro constructor en la misma clase
- 20. ¿Por qué tengo que llamar a superdedeloc último y no primero?
- 21. ¿Cómo llamar a un constructor diferente condicionalmente en Java?
- 22. get padre extiende la clase en php
- 23. java.lang.VerifyError: (clase: ea/Individual, método: <init> firma: (I) V) El constructor debe llamar a super() o this()
- 24. Llamar a un método desde el constructor en Coffeescript
- 25. ¿Cuándo necesita llamar explícitamente a un constructor de superclase?
- 26. ¿Puedo llamar a un constructor sobrecargado de otro constructor de la misma clase en C#?
- 27. Llamar a un constructor de la clase padre de un niño de clase en Python
- 28. No llamar al constructor de la clase base de la clase derivada
- 29. Llamar a un método en Constructor
- 30. ¿Está bien llamar a [super loadView]?
Gracias por una gran respuesta! ¿Cómo conociste esa funcionalidad secreta (Súper inserción automática)? –
http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f30.html - En la sección denominada ** Métodos de constructor ** –
¿Suprimir el constructor padre significa que ninguno de los constructores ancestrales recibe una llamada o simplemente la superclase inmediata? –