Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Зачем нужен кастинг ? (http://www.flasher.ru/forum/showthread.php?t=123853)

Fatality 12.04.2009 02:30

Зачем нужен кастинг ?
 
Здраствуйте. Объясните мне пожалуйста, зачем нужен кастинг ? Да да, именно зачем, а не что это такое. Проблемы как таковой нет, но есть здоровый интерес. Вот к примеру написал:
Код AS3:

package {
        import flash.display.Sprite;
        import flash.text.TextField;
        import flash.events.Event;
        import flash.events.MouseEvent;
        public class RootClass extends Sprite {
                private var txt:TextField;
                public function RootClass() {
                        stage.addEventListener("click", onStageClick);
                }
                public function onStageClick(event:MouseEvent) {
                        txt = new TextField();
                        txt.type = "input";
                        txt.x = event.stageX;
                        txt.y = event.stageY;
                        txt.addEventListener("added", onTxtAdded);
                        addChild(txt);
                }
                public function onTxtAdded(event:Event) {
                        trace(event.target);
                        stage.focus = event.target as TextField;
                }
        }
}

Если убрать кастинг, то компилятор начнет материться о невозможности преобразовать тип Object в InteractiveObject. Тут впринципе все понятно, но какого тогда trace(event.target), выдает — [object TextField]. Это компилятор так издевается ? Если он и так знает, что это текстовое поле, то что он от меня хочет ?!

fljot 12.04.2009 02:50

ну так trace не компилятор выдаёт, а уже плеер(виртуальная машина?) в процессе исполнения. а компилятор ругается во время компиляции.

BlooDHounD 12.04.2009 02:56

трэйс выдаёт то, что выдаёт метод toString()

Fatality 12.04.2009 03:21

Цитата:

трэйс выдаёт то, что выдаёт метод toString()
Это и так понятно, только сути вопроса не меняет.

BlooDHounD 12.04.2009 04:01

ну если это понятно, тогда зачем так яро обращено внимание в вопросе на этот факт?

кастинг нужен для того, что бы виртуальная машина не обращалась к объекту за списком классов и не искала в нём нужный класс. в случаи с методами/свойствами идёт ещё обращение к таблице методов всех классов, и поиск в ней нужного метода, потом попытка найти в динамических свойствах и т.д.

короче, Вы делает работу за ВМ, тем самым упрощая ей жизнь.

Gaen 12.04.2009 05:19

BlooDHounD, где можно подробнее почитать про работу виртуальной машины?

Fatality 12.04.2009 05:46

Вот теперь понятно, большое спасибо BlooDHounD, а то меня начинал напрягать этот вопрос.

Smrad 14.04.2009 14:28

Прикольно, а я думал, что даункасты не нужны. Т.е. использование собственно типа как id типа это всегда фейл.

BlooDHounD 14.04.2009 14:44

GAIKER, в интернете.
Smrad, а даункасты и не нужны.

etc 14.04.2009 14:47

Цитата:

Сообщение от Smrad (Сообщение 812683)
Прикольно, а я думал, что даункасты не нужны. Т.е. использование собственно типа как id типа это всегда фейл.

Не каждый Object есть TextField.

Smrad 14.04.2009 15:08

Цитата:

Сообщение от __etc (Сообщение 812686)
Не каждый Object есть TextField.

Это понятно.

Я вот просто тут сижу и медитирую на вот такой вот код:
Код AS3:

for ( j = 0; j < BUILDINGS_OBJECTS.numChildren; j++ ) {                                        
        if ( BUILDINGS_OBJECTS.getChildAt( j ) is house1 && ALLAY_WEAPONS_OBJECTS.getChildAt( i ).hitTestObject( BUILDINGS_OBJECTS.getChildAt( j ) ) ) {                                               
                _rocket = ALLAY_WEAPONS_OBJECTS.getChildAt( i ) as rocket;
                if ( !_rocket.explosion ) {
                        _rocket.explosion = ConstAttributes.FRAME_GROUND_BLAST;
                        _house1 = BUILDINGS_OBJECTS.getChildAt( j ) as house1;
                        _house1.destruction = ConstAttributes.WEAPONS_BOMB_DAMAGE;
                }
        }else if ( BUILDINGS_OBJECTS.getChildAt( j ) is house2 && ALLAY_WEAPONS_OBJECTS.getChildAt( i ).hitTestObject( BUILDINGS_OBJECTS.getChildAt( j ) ) ) {                                                       
                _rocket = ALLAY_WEAPONS_OBJECTS.getChildAt( i ) as rocket;
                if ( !_rocket.explosion ) {
                        _rocket.explosion = ConstAttributes.FRAME_GROUND_BLAST;
                        _house2 = BUILDINGS_OBJECTS.getChildAt( j ) as house2;
                        _house2.destruction = ConstAttributes.WEAPONS_BOMB_DAMAGE;
                }
        }else if ( BUILDINGS_OBJECTS.getChildAt( j ) is house3 && ALLAY_WEAPONS_OBJECTS.getChildAt( i ).hitTestObject( BUILDINGS_OBJECTS.getChildAt( j ) ) ) {                                               
                _rocket = ALLAY_WEAPONS_OBJECTS.getChildAt( i ) as rocket;
                if ( !_rocket.explosion ) {
                        _rocket.explosion = ConstAttributes.FRAME_GROUND_BLAST;
                        _house3 = BUILDINGS_OBJECTS.getChildAt( j ) as house3;
                        _house3.destruction = ConstAttributes.WEAPONS_BOMB_DAMAGE;
                }
        }else if ( BUILDINGS_OBJECTS.getChildAt( j ) is runway ) {
                old_point = new Point( ALLAY_WEAPONS_OBJECTS.getChildAt(i).x, ALLAY_WEAPONS_OBJECTS.getChildAt(i).y );
                new_point = BUILDINGS_OBJECTS.localToGlobal( old_point );
                if ( runway( BUILDINGS_OBJECTS.getChildAt(j) ).getTestClip().hitTestPoint( new_point.x, new_point.y, true ) ) {       
                        _rocket = ALLAY_WEAPONS_OBJECTS.getChildAt( i ) as rocket;
                        if ( !_rocket.explosion ) {
                                _rocket.explosion = ConstAttributes.FRAME_GROUND_BLAST;
                                _runway = BUILDINGS_OBJECTS.getChildAt( j ) as runway;
                                _runway.destruction = ConstAttributes.WEAPONS_BOMB_DAMAGE;
                        }
                }                                       
        }                                       
}

а мне его ещё модифицировать.
Моя бы воля, as и особенно is из языка выкинул бы.

etc 14.04.2009 15:12

Smrad, этот код ужасен сам по себе и вовсе не из-за is и as.

iNils 14.04.2009 15:17

Smrad, давайте избыточную табуляцию вы сами будете убирать, а не модераторы?

Smrad 14.04.2009 15:20

Цитата:

Сообщение от iNils (Сообщение 812697)
Smrad, давайте избыточную табуляцию вы сами будете убирать, а не модераторы?

ok. Просто скопипастил не посмотрев.

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

Сообщение от __etc (Сообщение 812696)
Smrad, этот код ужасен сам по себе и вовсе не из-за is и as.

Согласен, но is и as позволили это написать, и что ещё ужаснее, это работает.

DarkLight 14.04.2009 16:41

Цитата:

Согласен, но is и as позволили это написать
а не было бы - код был бы еще страшнее

Psycho Tiger 14.04.2009 17:35

А что вы предлагаете вместо is?
Как обьяснить машине, что мы только что загрузили? Байтовый массив или сразу жпг картинку?

Smrad 14.04.2009 18:07

Я, видимо, не совсем правильно объяснил свою позицию.
Поинт был в том, что даункасты чаще всего идут парой с полем типа.
А is - это почти оно и есть, особенно в неопытных руках.


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

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