Просмотр полной версии : прямой кастинг типов
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
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
не работает так!!!
Там же опечатка, должно брать.
Еще можно сделать так, если работаете во FlashDevelop:
public var downObjects/*module*/:Array=new Array();
Это типа подсказка на уровне среды разработки.
Но по мне, лучше использовать Vector, если в массиве будете хранить объекты одного класса.
viktorami
30.12.2011, 17:39
нет. в обычном флэш. массив объявлял просто. а как надо?
Класс module какой класс расширяет?
Класс module какой класс расширяет?
Разве это имеет значение? Такая конструкция работала и работает. Удивительно, что у человека какие-то проблемы возникли.
Добавлено через 3 минуты
Хотя есть подозрения, что module вкомпиливается в проект только при объявлении переменной с этим типом, т.е var st:module. А при прямом кастинге - нет нигде ни одной переменной с таким типом, и соответственно module не вкомпиливается.
Это только предположения. Попробуйте в конструкторе класса (в котором выполняете кастинг) упомянуть тип, просто объявив var st:module
Разве это имеет значение?
Имеет. Если у этого класса (или суперкласса) нет такого свойства.
viktorami
30.12.2011, 17:57
вектор подошел, спасибо. а можно оттуда как то удалить из середины один член -чтобы остальыне сдвинулись - или придется в цикле переназначат?
viktorami
30.12.2011, 18:08
и что? все сдвинется а индекс 1- удалится?
и что? все сдвинется а индекс 1- удалится?
Я тут по-вашему пишу, чтобы людей запутать?
Добавлено через 1 минуту
Vector#splice() (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/index.html#!Vector.html#splice%28%29)
Сомнения меня берут по поводу термина "прямое приведение".
Воспитывался у Мука. Приведение по нему бывает восходящим или нисходящим. Могу показаться неграмотным в этом вопросе, но что тогда означает "обратное приведение"? Чуть гуглил, конечно, но сильно авторитетных источников не встретил.
Похоже "прямое" и "обратное" приведение - это просто неудачный перевод. У Мука это названо 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]);
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.