PDA

Просмотр полной версии : прямой кастинг типов


viktorami
30.12.2011, 16:33
собственно как такового вопроса нет- хочу уточнить как это сделат рациональнее.
У меня есть массив, и пишу туда объект собсвтенного типа(внешний класс) а потом хочу получить доступ к его параметрам

public var downObjects:Array=new Array();
main.downObjects[1]=logo;
var st:module=main.downObjects[1] as module;
trace("!!!!!!!!!!!!!!"+st.x);
получается только так
а хотелось бы без объявления полностью лишней буферной переменной. как то вот так:
public var downObjects:Array=new Array();
main.downObjects[1]=logo;
trace((main.downObjects[1] as module).x;
но ничего что то не выходит.

Zebestov
30.12.2011, 16:36
Может из-за того, что в конце скобка опущена? Просто больше ошибок не вижу.

viktorami
30.12.2011, 16:39
нет. дело в том что такой синтаксис в приципе не берет! не видит его - как объект со всеми свойствами присущими module

TanaTiX
30.12.2011, 17:01
А Vector не подойдет?

viktorami
30.12.2011, 17:05
то есть?

BezDelnik
30.12.2011, 17:09
используйте вектор (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/Vector.html) вместо массива

crazyone
30.12.2011, 17:11
нет. дело в том что такой синтаксис в приципе не берет! не видит его - как объект со всеми свойствами присущими module

Что значит не видит?
Все должно работать. Только скобку добавь

viktorami
30.12.2011, 17:28
(mainC.downObjects[1] as module).x
не работает так!!!

zuxul
30.12.2011, 17:31
Там же опечатка, должно брать.
Еще можно сделать так, если работаете во FlashDevelop:
public var downObjects/*module*/:Array=new Array();
Это типа подсказка на уровне среды разработки.
Но по мне, лучше использовать Vector, если в массиве будете хранить объекты одного класса.

viktorami
30.12.2011, 17:39
нет. в обычном флэш. массив объявлял просто. а как надо?

КорДум
30.12.2011, 17:42
Класс module какой класс расширяет?

i.o.
30.12.2011, 17:50
Класс module какой класс расширяет?
Разве это имеет значение? Такая конструкция работала и работает. Удивительно, что у человека какие-то проблемы возникли.

Добавлено через 3 минуты
Хотя есть подозрения, что module вкомпиливается в проект только при объявлении переменной с этим типом, т.е var st:module. А при прямом кастинге - нет нигде ни одной переменной с таким типом, и соответственно module не вкомпиливается.
Это только предположения. Попробуйте в конструкторе класса (в котором выполняете кастинг) упомянуть тип, просто объявив var st:module

КорДум
30.12.2011, 17:53
Разве это имеет значение?
Имеет. Если у этого класса (или суперкласса) нет такого свойства.

viktorami
30.12.2011, 17:57
вектор подошел, спасибо. а можно оттуда как то удалить из середины один член -чтобы остальыне сдвинулись - или придется в цикле переназначат?

i.o.
30.12.2011, 17:59
vector.splice(index, 1)

viktorami
30.12.2011, 18:08
и что? все сдвинется а индекс 1- удалится?

i.o.
30.12.2011, 18:10
и что? все сдвинется а индекс 1- удалится?
Я тут по-вашему пишу, чтобы людей запутать?

Добавлено через 1 минуту
Vector#splice() (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/index.html#!Vector.html#splice%28%29)

dimarik
30.12.2011, 19:00
Сомнения меня берут по поводу термина "прямое приведение".
Воспитывался у Мука. Приведение по нему бывает восходящим или нисходящим. Могу показаться неграмотным в этом вопросе, но что тогда означает "обратное приведение"? Чуть гуглил, конечно, но сильно авторитетных источников не встретил.

goodguy
30.12.2011, 21:13
Похоже "прямое" и "обратное" приведение - это просто неудачный перевод. У Мука это названо Upcasting and Downcasting. И действительно, самый разумный вариант перевода, по-моему "восходящее" и "низходящее" приведение. Я бы тоже так перевел.

Но! Есть у него в этой же главе еще одна интересная штука:
An as operation returns the value of
expression if the specified expression belongs to the specified type; otherwise, it
returns null.

Соответственно то, что мы видим в этой теме - нифига не приведение к типу вообще. А просто проверка принадлежит ли объект к такому-то типу. А приведение было бы таким:

module(main.downObjects[1]);