Форум 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)

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.


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

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