Разве мне не нужно вызывать super () в конструкторе, когда класс расширяет Sprite в actionscript3? - PullRequest
5 голосов
/ 24 сентября 2011

Я всегда не вызываю super (), когда расширяю Sprite.
Но разве not calling super() не вызывает никаких проблем?

До сих пор у меня не было никаких проблем, и я никогда не видел кода, который вызывает super () в конструкторе, класс которого расширяет Sprite.

Как насчет TextField?
У меня тоже нет проблем с TextField.

Как узнать, должен ли я вызывать super () или нет?

Ответы [ 3 ]

30 голосов
/ 24 сентября 2011

Если flash не обнаруживает вызов super() в вашем дочернем конструкторе, тогда flash будет неявно вызывать super() до конструктора вашего дочернего элемента.Итак:

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

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

new Child();
// Parent
// Child

Таким образом, ваш дочерний конструктор по сути выглядит таквлияет на класс вашего ребенка.

Так зачем вам явно вызывать super()?

Первая причина заключается в том, что flash только автоматически генерирует вызов без параметров super, что означает, что есливаш конструктор родительских классов требует аргументов, тогда вам нужно будет явно вызвать его с этими аргументами.Если в этом случае вы пропустите вызов super(args...), вы получите ошибку компилятора.

Во-вторых, если даже у вашего родителя есть конструктор без параметров, вы можете использовать super() для управления порядком, в которомКонструкторы исполняют.Flash всегда вставляет вызов перед конструктором childs.Так что, если вы хотите изменить этот порядок.Тогда

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

сделает это в обратном порядке.Или вы можете сделать:

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

И, наконец, есть очень неясный способ не вызвать конструктор ваших родителей, сказав:

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

Потому что там видит flashэто вызов, он не вставляется.Однако поскольку он стоит за if (false), он никогда не вызывается, поэтому родительский класс никогда не инициализируется.

4 голосов
/ 24 сентября 2011

Если вы не вызовете super() явно, Flash сделает это автоматически до всего остального кода в вашем конструкторе.

Если вы вызовете super() явно, он будет вызван в той строке, на которой вы его написали.

Однако учтите, что вы не можете устанавливать или получать какие-либо свойства this или super или вызывать какие-либо методы до создания экземпляра суперкласса

1 голос
/ 24 сентября 2011

Вы можете безопасно исключить вызов базового конструктора. Если вы не вызовете super() в конструкторе, компилятор добавит вызов базового конструктора без аргументов.

...