2011-09-24 12 views

Odpowiedz

28

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.

+0

Dzięki za wspaniały odpowiedź! Skąd znasz tę tajną funkcję (automatyczne super wstawianie)? –

+4

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f30.html - W sekcji o nazwie ** Constructor Methods ** –

+1

Czy wyłączenie konstruktora macierzystego oznacza, że ​​żaden z konstruktorów przodków nie jest wywoływany lub po prostu bezpośrednia nadklasa? –

1

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.

4

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

Powiązane problemy