![]() |
странное поведение as
Доброго времени суток. Возникла проблема с пониманием работы оператора as. Читал help и Мука и данный faq, но честно говоря, не понял.
На примере данного кода: Почему же вызывается метод destroy класса MapObject? Ведь разные типы имеют переменная _layerMain и класс MapObject. Код AS3:
|
_layerMain - имеет один тип, а _layerMain.getChildAt(0) - это совершенно другой обьект, который может иметь (и, в вашем случае, имеет) другой тип.
|
Цитата:
Код AS3:
|
что у Вас находится по адресу: _cells[brush.tileY][brush.tileX] и будет восприниматься как MapObject
|
Тип переменной _cells не переводится в этом коде в MapObject. Чтобы таки попробовать перевести и убедиться, что Array не переводится в MapObject, надо писать
Код AS3:
Код AS3:
|
приведите пример я че то не догоняю.
|
у вас на спрайте _layerMain лежит объект MapObject (от DisplayObject).
у вас в массиве _cells "лежит по адресу" [brush.tileY][brush.tileX] объект MapObject (от DisplayObject). |
_cells - сам массив
_cells[brush.tileY][brush.tileX] - конкретный элемент массива |
Цитата:
Аналогичный пример: Код AS3:
Код AS3:
Код AS3:
|
Цитата:
|
|
(msg as C) даст null. А у null нет такого поля - helloBoys
|
Вы серьезно? Такие вопросы исчезают после первой нормальной книги об ООП или даже статье.
Цитата:
Цитата:
Цитата:
|
1.
Цитата:
Цитата:
Цитата:
Еще раз. Кастинг не меняет класс объекта. Он проверяет, можно ли использовать объект как определенный Тип данных, и возвращает null, если нельзя (как в Вашем примере). Другими словами, если в массив из первого примера сложить экземпляры другого класса, они не будут кастоваться в MapObject, as вернет null и Вы получите ошибку. Класс это то, чем объект "является" сам по себе. А тип это то, как он используется в текущем контексте. Это может быть реальный класс объекта, любой из его супер-классов и любой из его Интерфейсов. Но никак не любой класс, который взбредет в голову. |
Цитата:
|
Wolsh выше все очень подробно расписал.
|
Я лично тоже ничего б не понял из обьяснений Wolsh %) По-моему класс может вполне употребляться в смысле тип и наоборот. Обьект (какого-то класса или обьект какого-то типа) можно говорить в смысле переменная/экземпляр класса.
Про конвертацию лучше на примере. Код AS3:
|
-De-, это все понятно. В данных примерах Sprite яв-ся потомком класса DisplayObject. Вы объясните вот что, сама операция as меняет тип переменной или же нет. Т.е.
Код AS3:
|
Не меняет, а только приводит.
Конструкция Цитата:
|
Цитата:
Код AS3:
Что вы подразумеваете под словом приводит. Не понятно. Дайте какой-нибудь синоним данного слова. Если msg as C не меняет тип C, то это означает что переменная msg сохраняет тип B, и получается что строчка msg as C проводит проверку яв-ся тип переменной msg супертипом для C. |
Приводить можно к родителям или к их родителям и так далее.
Вы похожи на папу, а не папа похож на вас. Таким образом можно объявить переменную типа ПАПА, а создать ВАС. Но нельзя объявить вас и создать папу. Sprite папа MovieClipa |
Цитата:
Код AS3:
Котяра говорит, что должно быть так Код AS3:
Следовательно ошибка возникает верно. Мы не можем вызывать метод описанный в ребенке, если этот ребенок не расширяет родительский класс B. Я же говорю так Код AS3:
|
Цитата:
Код AS3:
Код AS3:
Цитата:
Код AS3:
Вы умеете говорить "привет, мальчики" - (daddy as I).приветМальчики(), но только при условии что в переменная daddy указывает на объект класса I (который расширяет Daddy) |
Да, верно))
Только если в переменную msg действительно записана ссылка на объект класса С, иначе получите null. |
class Я extends Папа
Я расширяю Папу :о) Папа в ООП проще. |
Я бы просто посоветовал напрячься и изжить из своего сознания употребление терминов Parent/Child (папа/я, родитель/ребенок) при разговоре о наследовании. Поможет избежать разных неприятных ситуаций, ибо эти термины не имеют никакого отношения к наследованию (хотя иногда употребляют выражение "родительский класс" вместо суперкласс, но думаю никто никогда не слышал о "детском классе").
|
По правде сказать я уже сам запутался.
Короче Код AS3:
Цитата:
|
Всем большое спасибо за помощь. Реально помогли разобраться с простыми вещами.
|
| Часовой пояс GMT +4, время: 13:22. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.