Zawsze nie nazywam super(), gdy rozszerzam Sprite.
Ale czy not calling super()
nie powoduje żadnych problemów?
Do tej pory nie mam żadnych problemów i nigdy nie widziałem kodu, który wywołuje super() w konstruktorze, którego klasa rozszerza Sprite.
Co z TextField?
Nie mam też żadnego problemu z TextField.
Jak sprawdzić, czy powinienem zadzwonić super() czy nie?Czy nie muszę wywoływać super() w konstruktorze, gdy klasa rozszerza Sprite w actionscript3?
Odpowiedz
Jeśli lampa nie wykrywa połączenia do super()
w swoim konstruktorze dziecka wtedy lampa błyskowa niejawnie rozmowy super()
przed konstruktora dziecka. Więc:
public class Parent {
public function Parent() {
trace("Parent");
}
}
public class Child extends Parent {
public function Child() {
trace("Child");
}
}
new Child();
// Parent
// Child
Więc konstruktor dziecko w zasadzie wygląda to
public function Child() {
super(); // <-- Added by flash!
trace("Child");
}
tak, nie, pomijając wyraźne wezwanie do super()
nie zwykle niekorzystnie wpływać na klasę dziecka.
Dlaczego więc chcesz jednoznacznie dzwonić pod numer super()
?
Pierwszym powodem jest to lampa błyskowa będzie zawsze tylko automatycznie generować połączenia bez parametrów do super
, co oznacza, że jeśli rodzic klasy konstruktor wymaga argumenty, następnie trzeba będzie jawnie wywołać ją z tymi argumentami. Jeśli w tym przypadku pominiesz wywołanie super(args...)
, pojawi się błąd kompilatora.
Po drugie, jeśli nawet twój rodzic ma konstruktora bez parametrów, możesz użyć super()
, aby kontrolować kolejność wykonywania konstruktorów. Flash zawsze wstawi wywołanie przed konstruktorem childs. Więc jeśli chcesz zmienić tę kolejność. Następnie można wykonać to w odwrotnej kolejności. Albo można zrobić:
public class Child extends Parent {
public function Child() {
// work before initilizing parent
super()
// work after initilizing parent
}
}
Wreszcie, jest bardzo niejasny sposób nie zadzwonić do konstruktora rodziców mówiąc:
public class Child extends Parent {
public function Child() {
if(false) super()
}
}
Bo widzi błysk nie jest wezwaniem, nie robi wstaw jeden. Jednak ponieważ jest za if (false)
, nigdy nie jest wywoływana, więc klasa nadrzędna nigdy nie zostanie zainicjowana.
Możesz bezpiecznie wykluczyć połączenie z konstruktorem podstawowym. Jeśli nie wywołasz super()
w konstruktorze, kompilator doda połączenie do konstruktora bazowego bez żadnych argumentów.
Jeśli nie zadzwonić super()
wyraźnie, Flash zrobi to automatycznie przed wszystko inny kod w konstruktorze.
Jeśli zadzwonisz pod numer super()
, zostanie on wywołany w wierszu, w którym został napisany.
Należy jednak pamiętać, że nie można ustawić lub wystąpią jakiekolwiek this
lub super
właściwości lub zadzwoń żadnych metod przed super klasa jest tworzony
- 1. super() w konstruktorze
- 2. Dlaczego wywołanie super() w konstruktorze?
- 3. Czy muszę wielokrotnie wywoływać Crashlytics.start?
- 4. Kiedy NIE wywoływać metody super() podczas przesłonięcia?
- 5. Czy super klasa nie wywołuje metody nadpisanej?
- 6. Actionscript3: Czy zmienna istnieje?
- 7. Co oznacza "klasa" w konstruktorze?
- 8. Czy muszę jawnie wywoływać podstawowy wirtualny destruktor?
- 9. Co robi wywołanie super() w konstruktorze React?
- 10. Czy muszę wywoływać wycofywanie, jeśli nigdy nie zatwierdzam?
- 11. Czy podklasy powinny wywoływać inicjatory w bezpośredniej super klasie?
- 12. Dlaczego muszę wywoływać super-wstępne alokacje na końcu, a nie pierwsze?
- 13. Dlaczego muszę wywoływać spyOn w beforeEach()?
- 14. Czy muszę wywołać [super init] lub [super initWithCoder], itp. Dla NSObject
- 15. MemoryStream w korzystaniu z instrukcji - czy muszę wywoływać close()
- 16. klasa rozszerza React.Component nie można używać getInitialState w React
- 17. Python klasa - Super zmienna
- 18. Czy klasa Non-Generic przyjmuje ogólny argument w konstruktorze
- 19. Dlaczego muszę wywoływać dispose na formantach ASP.NET?
- 20. Czy muszę wywoływać funkcję SuspendLayout dla każdej kontroli nad dzieckiem?
- 21. Klasa abstrakcyjna - Super Konstruktor (Java)
- 22. Jak obrócić węzeł sprite w zestawie sprite?
- 23. Klasa Java, która rozszerza String (lub podobny)
- 24. ImmutableList nie rozszerza listy?
- 25. Zmiana ikon Sprite w Sprite-Kit
- 26. Widoki grupowe w konstruktorze interfejsów
- 27. Czy muszę odłączyć zdarzenia w jQuery, gdy usuwam elementy
- 28. Rozszerza AlertDialog.Builder w Androidzie
- 29. dlaczego te() i super() nie mogą być używane razem w konstruktorze?
- 30. Ograniczyć sprite w cocos2d
Dzięki za wspaniały odpowiedź! Skąd znasz tę tajną funkcję (automatyczne super wstawianie)? –
http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f30.html - W sekcji o nazwie ** Constructor Methods ** –
Czy wyłączenie konstruktora macierzystego oznacza, że żaden z konstruktorów przodków nie jest wywoływany lub po prostu bezpośrednia nadklasa? –