Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   странное поведение as (http://www.flasher.ru/forum/showthread.php?t=171323)

goldlider 13.11.2011 23:40

странное поведение as
 
Доброго времени суток. Возникла проблема с пониманием работы оператора as. Читал help и Мука и данный faq, но честно говоря, не понял.
На примере данного кода:

Почему же вызывается метод destroy класса MapObject? Ведь разные типы имеют переменная _layerMain и класс MapObject.
Код AS3:

package
{
        public class GameMap extends Sprite
        {
                private var _layerMain:Sprite;
 
                public function GameMap()
                {
                        _layerMain = new Sprite();
                        addChild(_layerMain);
                }
 
                public function clear():void
                {
                        if (_layerMain.getChildAt(0) is MapObject)
                        {
                                /* destroy - это пользовательский метод класса MapObject
                                          class MapObject extends Sprite */

                                  (_layerMain.getChildAt(0) as MapObject).destroy();
                        }
                }
        }
}


-De- 13.11.2011 23:48

_layerMain - имеет один тип, а _layerMain.getChildAt(0) - это совершенно другой обьект, который может иметь (и, в вашем случае, имеет) другой тип.

goldlider 13.11.2011 23:58

Цитата:

Сообщение от -De- (Сообщение 1045847)
_layerMain - имеет один тип, а _layerMain.getChildAt(0) - это совершенно другой обьект, который может иметь (и, в вашем случае, имеет) другой тип.

Мне не важно что находится внутри _layerMain. Важно как он преобразует в тип MapObject. Хорошо приведу другой код

Код AS3:

private var _cells:Array
_cells[brush.tileY][brush.tileX] as MapObject

Почему же тип переменной _cells переводится в тип MapObject.

t4arty 14.11.2011 00:32

что у Вас находится по адресу: _cells[brush.tileY][brush.tileX] и будет восприниматься как MapObject

-De- 14.11.2011 00:39

Тип переменной _cells не переводится в этом коде в MapObject. Чтобы таки попробовать перевести и убедиться, что Array не переводится в MapObject, надо писать
Код AS3:

_cells as MapObject

В предыдущем примере это будет
Код AS3:

_layerMain as MapObject

Вы не видите отличия между _cells и _cells[brush.tileY][brush.tileX]?

goldlider 14.11.2011 00:42

приведите пример я че то не догоняю.

GBee 14.11.2011 01:01

у вас на спрайте _layerMain лежит объект MapObject (от DisplayObject).

у вас в массиве _cells "лежит по адресу" [brush.tileY][brush.tileX] объект MapObject (от DisplayObject).

Ookami 14.11.2011 01:31

_cells - сам массив
_cells[brush.tileY][brush.tileX] - конкретный элемент массива

goldlider 14.11.2011 12:40

Цитата:

Сообщение от GBee (Сообщение 1045862)
у вас на спрайте _layerMain лежит объект MapObject (от DisplayObject).

у вас в массиве _cells "лежит по адресу" [brush.tileY][brush.tileX] объект MapObject (от DisplayObject).

Откуда такое предположение, что в _cells[brush.tileY][brush.tileX] лежит объект MapObject?

Аналогичный пример:


Код AS3:

package
{       
        import flash.display.Sprite;
 
        public class A extends Sprite // Основной класс приложения
        {
                public function A()
                {       
                        var msg:B = new B();
                        (msg as C).helloBoys;
                }
        }
}

Код AS3:

package
{       
        public class B
        {
                public function B()
                {
 
                }
 
                function helloGirls():void
                {
                        trace("Come on babes");
                }
        }
}

Код AS3:

package
{       
        public class С
        {
                public function C()
                {
 
                }
 
                function helloBoys():void
                {
                        trace("Come on boys");
                }
        }
}

Почему в данном случае объект msg не приводится к типу C? Ведь данный пример яв-ся аналогом предыдущего. Здесь msg яв-ся аналогом _layerMain оба имеют разные типы и приводятся к типу не соответствующего иерархии наследования.

КорДум 14.11.2011 12:44

Цитата:

Почему в данном случае объект msg не приводится к типу C?
Потому что это приведение к типу. А не конвертирование в тип.


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

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