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

i.o. 14.11.2011 12:45

http://help.adobe.com/ru_RU/FlashPla...rators.html#as

КорДум 14.11.2011 12:47

(msg as C) даст null. А у null нет такого поля - helloBoys

GBee 14.11.2011 12:52

Вы серьезно? Такие вопросы исчезают после первой нормальной книги об ООП или даже статье.

Цитата:

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

Код AS3:

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


_cells массив, в него что угодно можно пихнуть, а судя по представленному ВАМИ коду в него пихнули MapObject

Цитата:

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

Wolsh 14.11.2011 13:00

1.
Цитата:

Откуда такое предположение
потому что с Ваших же слов
Цитата:

Почему же вызывается метод destroy класса MapObject?
2.
Цитата:

Почему в данном случае объект msg не приводится к типу C? Ведь данный пример яв-ся аналогом предыдущего.
Ничего подобного. Не путайте Класс объекта с Типом переменной. В случае с массивом возвращается ТИП Object, но сам возвращаемый объект имеет тот Класс, чьим экземпляром он был создан, в данном случае MapObject. Поэтому его можно скастовать для сохранения в переменной с Типом MapObject и вызывать у него методы класса MapObject. В Вашем "аналоге" Вы пытаетесь вызывать у экземпляра класса В (а точнее – у null, ибо кастинг вернет null) методы класса С. Откуда же им взяться?
Еще раз. Кастинг не меняет класс объекта. Он проверяет, можно ли использовать объект как определенный Тип данных, и возвращает null, если нельзя (как в Вашем примере). Другими словами, если в массив из первого примера сложить экземпляры другого класса, они не будут кастоваться в MapObject, as вернет null и Вы получите ошибку.
Класс это то, чем объект "является" сам по себе. А тип это то, как он используется в текущем контексте. Это может быть реальный класс объекта, любой из его супер-классов и любой из его Интерфейсов. Но никак не любой класс, который взбредет в голову.

goldlider 14.11.2011 13:14

Цитата:

Сообщение от КорДум (Сообщение 1045933)
Потому что это приведение к типу. А не конвертирование в тип.

Какая разница между этими двумя понятиями? По мне это одно и тоже.

КорДум 14.11.2011 13:19

Wolsh выше все очень подробно расписал.

-De- 14.11.2011 13:41

Я лично тоже ничего б не понял из обьяснений Wolsh %) По-моему класс может вполне употребляться в смысле тип и наоборот. Обьект (какого-то класса или обьект какого-то типа) можно говорить в смысле переменная/экземпляр класса.

Про конвертацию лучше на примере.

Код AS3:

var Name:String = (new Sprite()).toString();//это конвертация в тип String, Sprite не имеет никакого отношения к Sprite, при конвертации создается новый экземпляр класса/типа String.
trace(Name);
//конвертация из типа в тип существует достаточно редко, в основном в строку =)
 
var ObjectSprite:Object= new Sprite();
var ObjectDO:DisplayObject = ObjectSprite as DisplayObject;//не null, новый обьект не создался, это наш спрайт, это приведение. Привести к базовому классу можно всегда
var ObjectSameSprite:Sprite = ObjectSprite as Sprite;//не нулл, приводим
var ObjectMC:MovieClip = ObjectSprite as MovieClip ;//null, Sprite не приводится к MovieClip
//попробуйте заменить new Sprite() на new MovieClip


goldlider 14.11.2011 14:31

-De-, это все понятно. В данных примерах Sprite яв-ся потомком класса DisplayObject. Вы объясните вот что, сама операция as меняет тип переменной или же нет. Т.е.
Код AS3:

msg:B
(msg as C)

поменяет ли тип переменная msg на тип C? Если да, то только в том случае если C яв-ся подтипом типа B?

Котяра 14.11.2011 14:47

Не меняет, а только приводит.
Конструкция
Цитата:

msg:B
(msg as C)
сработает только если B extends C или B implement С, но никак не наоборот

goldlider 14.11.2011 14:57

Цитата:

Сообщение от Котяра (Сообщение 1045963)
Не меняет, а только приводит.
Конструкция

сработает только если B extends C или B implement С, но никак не наоборот

То, что вы говорите это тоже самое что:
Код AS3:

var ObjectSprite:MovieClip = new Sprite();
ObjectSprite as MovieClip;

Такого быть не может. MovieClip extends Sprite, а не наоборот.

Что вы подразумеваете под словом приводит. Не понятно. Дайте какой-нибудь синоним данного слова. Если msg as C не меняет тип C, то это означает что переменная msg сохраняет тип B, и получается что строчка msg as C проводит проверку яв-ся тип переменной msg супертипом для C.


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

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