Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   setChildIndex() против повторного addChild() (http://www.flasher.ru/forum/showthread.php?t=139635)

Zebestov 06.05.2010 20:13

setChildIndex() против повторного addChild()
 
собственно
Код AS3:

super.setChildIndex(myMC, super.numChildren - 1);

против
Код AS3:

super.addChild(myMC);

второе выглядит компактней, но как-то не знаю =)
кто что думает?

i.o. 06.05.2010 20:27

Лично мне второй больше нравится. А совсем по-правильному - юзать первый нужно.

silin 06.05.2010 20:32

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

BlooDHounD 06.05.2010 20:34

тесты показывают что абсолютно пофигу какой вариант юзать. но мне нравится первый, ибо считаю его более правильным.

orcpochta 06.05.2010 20:45

А почему, собственно, - 1?

не понял, что происходит)) и о чем должно говорить super - что происходит-то?))

Zebestov 06.05.2010 20:50

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

спасибо. буду бороться с собой =)

Добавлено через 3 минуты
Цитата:

Сообщение от orcpochta (Сообщение 906397)
А почему, собственно, -1? не понял, что происходит))

бо будет RangeError
Цитата:

Сообщение от orcpochta (Сообщение 906397)
и о чем должно говорить super - что происходит-то?))

Да, super говорит мало. Но он говорит смачно! Спросите Бормана!

Psycho Tiger 06.05.2010 22:54

super говорит о том, что метод определен в суперклассе.

orcpochta 06.05.2010 23:10

мне кажется сомнительным, что автор переопределял эти методы где-то - иначе он бы не спрашивал о них в форуме без дополнительных пояснений

в разговоре о методах super (как нечто уточняющее) выглядит как-то странно, я стал искать подвох, связанный конкретно с этим super, но в упор его не вижу

udaaff 06.05.2010 23:55

Для того, чтобы использовать super.method() он не обязательно должен быть переопределен.

orcpochta 07.05.2010 00:04

естественно)))

если бы это в куске кода было - у меня бы и мыслей никаких по этому поводу не возникло - стиль такой и ладно

но там это странно выглядело))

Zebestov 07.05.2010 00:15

да привык уже просто =) я и "повороты" в чистом поле включаю 0о

dimarik 07.05.2010 00:30

Нашего полку прибыло )

orcpochta 07.05.2010 00:49

Цитата:

Сообщение от Zebestov (Сообщение 906465)
да привык уже просто =) я и "повороты" в чистом поле включаю 0о

а this пишите?)) или когда к статическому свойству или методу класса обращаетесь внутри этого же класса пишите имя класса MyClass.prop?

Если нет, то это частичное лицемерие - я им тоже страдаю, но по другим поводам)))

udaaff 07.05.2010 01:10

Цитата:

а this пишите?)) или когда к статическому свойству или методу класса обращаетесь внутри этого же класса пишите имя класса MyClass.prop?

Если нет, то это частичное лицемерие - я им тоже страдаю, но по другим поводам)))
Это несколько из другой оперы.
Метод может быть переопределен в дочерних классах. Вполне логично, если я хочу, чтобы суперкласс использовал логику своих методов, а не дочернего класса.

orcpochta 07.05.2010 01:24

Цитата:

Сообщение от udaaff (Сообщение 906478)
Это несколько из другой оперы.
Метод может быть переопределен в дочерних классах. Вполне логично, если я хочу, чтобы суперкласс использовал логику своих методов, а не дочернего класса.

можно подробней - не совсем понял

есть класс MyClass, его расширяет MyClassExtension

в MyClass есть методы
Код AS3:

protected function a ( ):void
{
}
 
protected function b ( ):void
{
    a( );
}

в MyClassExtension
Код AS3:

override protected function a ( ):void
{
}

Если мы вызовем метод b( ) из экземпляра MyClassExtension, то он вызовет a( ) из MyClassExtension, но если в методе b( ) класса MyClass прописать super.a( ), то вызовется a( ) из MyClass. А если мы увеличим длину цепи расширений, что вызовется? Я запутался))) Объясните подробней, если не трудно)))

i.o. 07.05.2010 01:40

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

orcpochta 07.05.2010 01:43

Цитата:

Сообщение от i.o. (Сообщение 906484)
super вызывается в классе, наследуемом от базового (суперкласса), чтобы вызвать непереодределенную, наследником, функцию или аксессор базового класса.

я это знаю, я пытаюсь понять, что сказал мне udaaff и импровизирую на ходу

i.o. 07.05.2010 01:48

очевидно, что вызовется непереопределенный метод, т.е
Цитата:

но если в методе b( ) класса MyClass прописать super.a( ), то вызовется a( ) из MyClass
вызовется a( ) из MyClass

orcpochta 07.05.2010 01:50

там другой момент мне не очевиден, какой метод вызовется без этого super

udaaff 07.05.2010 02:05

В смысле "увеличим длину цепи расширений"? Унаследуемся от MyClassExtension и переопределим метод a()?
Вызовется этот переопределенный метод, если так.
В любом случае, несложно провести эксперимент. trace'ы расставить или в debugger'e посмотреть последовательность вызовов.

orcpochta 07.05.2010 02:07

Цитата:

Сообщение от udaaff (Сообщение 906491)
В смысле "увеличим длину цепи расширений"? Унаследуемся от MyClassExtension и переопределим метод a()?
Вызовется этот переопределенный метод, если так.

воооот... тогда какой смысл в первоначальном super, если он в первом случае гарантирует, а во втором нет? - пробой логики конструкции

i.o. 07.05.2010 02:07

Цитата:

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

Вот у меня зато вопрос возник. Разве нельзя использовать super в классе, который не наследуется ни отчего (или extends Object)?

Вот примерчик, который выдает рантайм ошибку. Может что неправильно делаю?
Код AS3:

var _b:ClassB = new ClassB();
 
 
trace( "_b.methodA(): " + _b.methodA() );
trace( "_b.methodB(): " + _b.methodB() );
trace( "_b.methodC(): " + _b.methodC() );
trace( "_b.methodD(): " + _b.methodD() );

ClassA.as
Код AS3:

package
{
        public class ClassA //extends Object
        {
                public function ClassA()
                {
                      //super();
                }
 
 
                public function methodA():String
                {
                        return "ClassA::methodA()";
                }
 
                public function methodB():String
                {
                        return methodA();
                }
 
                public function methodC():String
                {
                        return this.methodA();
                }
 
                public function methodD():String
                {
                        return super.methodA();
                }
        }
}

ClassB.as
Код AS3:

package
{
        public class ClassB extends ClassA
        {
                public function ClassB()
                {
                        super();
                }
 
 
                override public function methodA():String
                {
                        return "ClassB::methodA()";
                }
        }
}

Цитата:

_b.methodA(): ClassB::methodA()
_b.methodB(): ClassB::methodA()
_b.methodC(): ClassB::methodA()
ReferenceError: Error #1070: Method methodA not found on Object
at ClassA/methodD()
at test_fla::MainTimeline/frame1()
С одной стороны понятно, что в базовом классе нет такой функции, но с другой то - мог бы FP и догадаться что, нужно вызвать ту, которая объявлена в самом начале.

udaaff 07.05.2010 02:16

Цитата:

Сообщение от orcpochta (Сообщение 906492)
воооот... тогда какой смысл в первоначальном super, если он в первом случае гарантирует, а во втором нет? - пробой логики конструкции

В обоих случаях гарантирует :) Ты что-то не так понял.

Hidest 07.05.2010 02:32

Что-то совсем не в ту степь тема пошла :)... Подсознательно первый вариант кажется лучше. Про второй просто не думал до этого топика (хотя, все логично) - это касаемо изначального смысла топика...

orcpochta 07.05.2010 02:35

Цитата:

Сообщение от udaaff (Сообщение 906494)
В обоих случаях гарантирует :) Ты что-то не так понял.

какой метод вызовется, если мы используем super.a( ) в методе b( ) корневого суперкласса и этот метод b( ) вызывается из экземпляра класса, который наследуется от корневого через один класс (и методы а( ) в расширениях переопределяются в каждом наследуемом классе)?

Добавлено через 15 минут
ааа... дошло вроде, про что топик - ну и тормоз))))

Цитата:

setChildIndex() против повторного addChild()
ключевое слово как-то не выцепил.

Первый вариант приятней в том смысле, что логика происходящего лучше читается

Zebestov 07.05.2010 12:16

Цитата:

Сообщение от orcpochta (Сообщение 906501)
ааа... дошло вроде, про что топик - ну и тормоз))))
Цитата:

setChildIndex() против повторного addChild()
ключевое слово как-то не выцепил.

отжег! а я все думаю, шо ж это такое происходит! :)

etc 07.05.2010 12:34

Цитата:

Сообщение от i.o. (Сообщение 906493)
С одной стороны понятно, что в базовом классе нет такой функции, но с другой то - мог бы FP и догадаться что, нужно вызвать ту, которая объявлена в самом начале.

В начале чего?

Psycho Tiger 07.05.2010 16:24

В самой начале цепочки наследования, т.е. насколько я понял i.o. хочет чтобы метод, не найденный наверху искался снизу. По мне и слава богу, что не ищется.

orcpochta, вопрос вообще не понял. По дефолту, если мы не пишем this или super поиск идёт среди локальных переменных. Не нашли? Поднимаемся выше. Ищем в полях класса. Не нашли? Идём в суперкласс. И там не нашли? Идём в суперкласс суперкласса. Когда пишем this или super мы уже фактически однозначно говорим, какой метод из многих потенциальных мы хотим вызвать. Я лично super пишу, this не пишу - у меня очень редко совпадают имена локальных переменных с именами полей класса. Почему пишу super? Потому что, например, в классе унаследованном от Sprite`а мне вдруг захочется перекрыть нафиг сеттеры x и y. Зачем - не знаю, как пример говорю. Перекрываю я их - и надо переписывать весь класс под super.x и super.y. Поэтому пишу сразу - я ведь однозначно знаю, что в этой задаче мне нужен будет именно тот x, который определен в Sprite.

orcpochta 07.05.2010 18:25

Psycho Tiger, это все понятно, но до сих пор не понимаю этих слов udaaff-а

Цитата:

Метод может быть переопределен в дочерних классах. Вполне логично, если я хочу, чтобы суперкласс использовал логику своих методов, а не дочернего класса.
я стал фантазировать, чтобы воссоздать ситуацию, когда суперкласс будет использовать логику дочернего класса

Psycho Tiger 07.05.2010 18:36

Создай класс A. Определи в нём метод method и метод callMethod, вызывающий method.
Создай класс B extends A. Переопредели в нём method и позови callMethod.

i.o. 07.05.2010 18:39

народ, go в соседнюю ветку, там как раз вопрос про переопреление

orcpochta 07.05.2010 18:40

Цитата:

Сообщение от Psycho Tiger (Сообщение 906668)
Создай класс A. Определи в нём метод method и метод callMethod, вызывающий method.
Создай класс B extends A. Переопредели в нём method и позови callMethod.

ну так я об этом и говорю, что если мы потом создадим класс С, расширяющий B и в свою очередь переопределяющий method, то при вызове метода callMethod вызовется метод уже из B, а не из A - т.е. ваш super ничего не гарантирует - так какой в нем смысл?

Psycho Tiger 07.05.2010 20:14

Ну вот смотри. Я вызываю метод (doMethod), который вызывает другой метод (method). Переопределяю в ребёнке method, и вызываю doMethod. Вызывается method ребёнка. Беда? Беда, а я хочу вызывать method суперкласса. А вот если я напишу в doMethod { super.method() } - тогда при вызове doMethod "как бы" инлайновый код будет выглядеть super.method - то есть метод суперкласса, тот, что нам нужен.


Часовой пояс GMT +4, время: 20:49.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.