Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.01.2017, 16:34
zackscript вне форума Посмотреть профиль Отправить личное сообщение для zackscript Найти все сообщения от zackscript
  № 1  
Ответить с цитированием
zackscript
 
Аватар для zackscript

Регистрация: Jan 2014
Сообщений: 181
Отправить сообщение для zackscript с помощью Skype™
По умолчанию Помогите понять строчку кода

Привет всем, я тысячакратно извиняюсь за тупой вопрос.
Ребят скажите как понять приведение типа такого характера:

Код AS3:
p = pool.getObject() as Point;
Дабы больше разъяснить, выкладываю весь код с одного сайта (возможно некоторые побывали там )):
Код AS3:
public final class ObjectPool
{
    private var pool:Vector.<Object>;
    private var counter:uint;
    private var className:Class;
 
    public function ObjectPool(className:Class, length:uint = 1)
    {
        this.className = className;
        pool = new Vector.<Object>(length);
 
        var i:uint = counter = length;
        //создадим начальный набор объектов
        while( --i > -1 )
            pool[i] = new className();
    }
 
    public function getObject():Object
    {
        if ( counter > 0 )
            return pool[ --counter ];
        // если объекты закончились
        // создаю объект и увеличивая длину массива
        pool.unshift( new className() );
        return pool[0];
    }
 
    public function releaseObject(value:Object):void
    {
        pool[ counter++ ] = value;
    }
 
    // необязательный метод для тестирования
    public function toString():String
    {
        return "Pool of " + className + " count = " + counter + "/" + pool.length;
    }
}
Здесь автор использует объект с непонятным мне приведением типа:

Код AS3:
var pool:ObjectPool = new ObjectPool(Point, 20);
trace(pool);
trace("---------");
for (var i:int = 0, p:Point; i < 40; i++)
{
    p = pool.getObject() as Point; // как здесь это работает ???
    p.x = Math.random() * 400;
    if(p.x > 300)
        pool.releaseObject(p);
    trace( pool.toString() );
}
Если я непонятно изложил свою проблему, попробую написать так:

ОбъектНекоегоКласса.какой-тоМетод () as Какой-тоТип; // вот как это работает ?

или же:
var _bit_map:Bitmap = _loader.content as Bitmap; // ?

Старый 28.01.2017, 17:04
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 2  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
В массив записывается набор экземпляров класса Point, однако сам класс совсем не знает, какой именно класс участвует в этом процессе. Именно поэтому в классе массив Object, под тип которого можно привести абсолютно что угодно.
Код AS3:
ОбъектНекоегоКласса.какой-тоМетод () as Какой-тоТип; // вот как это работает ?
метод ОбъектНекоегоКласса возвращает какой-то объект. В данном случае это
Цитата:
public function getObject():Object
{
if ( counter > 0 )
return pool[ --counter ];
// если объекты закончились
// создаю объект и увеличивая длину массива
pool.unshift( new className() );
return pool[0];
}
Где
Цитата:
private var pool:Vector.<Object>;
Но при этом этот объект не является экземпляром Object, а является его потомком.
В этом случае мы можем привести его тип к его истинному типу, которым он был до записи в Vector.<Object>.

Почему Point?
Потому, что мы передаём его в конструктор тут
Цитата:
var pool:ObjectPool = new ObjectPool(Point, 20);
Затем он проходит сюда
Цитата:
public function ObjectPool(className:Class, length:uint = 1)
{
this.className = className;
pool = new Vector.<Object>(length);

var i:uint = counter = length;
//создадим начальный набор объектов
while( --i > -1 )
pool[i] = new className();
}
Это значит, что Pool создаёт набор экземпляров класса, который мы передаём его в конструктор, записывает его в типизированный массив Object, и при вытаскивании нужно привести тип к истинному.

Object используется потому, что он является предком всех существующих и создаваемых вами классов. Можно привести тип любого экземпляра класса к Object.

Добавлено через 1 час 8 минут
Цитата:
var _bit_map:Bitmap = _loader.content as Bitmap;
_loader.content имеет также неопределённый тип: Loader может загружать как изображения(Bitmap), звуки(Sound), так и другие swf(Sprite, MovieClip)
__________________
There is no thing in this world that is not simple.


Последний раз редактировалось ZackMercury; 28.01.2017 в 17:15.
Старый 28.01.2017, 18:13
zackscript вне форума Посмотреть профиль Отправить личное сообщение для zackscript Найти все сообщения от zackscript
  № 3  
Ответить с цитированием
zackscript
 
Аватар для zackscript

Регистрация: Jan 2014
Сообщений: 181
Отправить сообщение для zackscript с помощью Skype™
так, ага...
Цитата:
В массив записывается набор экземпляров класса Point
А о каком Point здесь говорится о встроенном классе Point или обычный пользовательский класс ?

Старый 28.01.2017, 18:15
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 4  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Возможны оба варианта. Зависит от того, что импортировать перед этим кодом
Код AS3:
var pool:ObjectPool = new ObjectPool(Point, 20);
trace(pool);
trace("---------");
for (var i:int = 0, p:Point; i < 40; i++)
{
    p = pool.getObject() as Point; // как здесь это работает ???
    p.x = Math.random() * 400;
    if(p.x > 300)
        pool.releaseObject(p);
    trace( pool.toString() );
}
Если ваш собственный класс - то получится пул из ваших пользовательских точек.
Код AS3:
import com.zackscript.tools.Point;
var pool:ObjectPool = new ObjectPool(Point, 20);
trace(pool);
trace("---------");
for (var i:int = 0, p:Point; i < 40; i++)
{
    p = pool.getObject() as Point; // как здесь это работает ???
    p.x = Math.random() * 400;
    if(p.x > 300)
        pool.releaseObject(p);
    trace( pool.toString() );
}
Или встроенныx:
Код AS3:
import flash.geom.Point;
var pool:ObjectPool = new ObjectPool(Point, 20);
trace(pool);
trace("---------");
for (var i:int = 0, p:Point; i < 40; i++)
{
    p = pool.getObject() as Point; // как здесь это работает ???
    p.x = Math.random() * 400;
    if(p.x > 300)
        pool.releaseObject(p);
    trace( pool.toString() );
}
__________________
There is no thing in this world that is not simple.


Последний раз редактировалось ZackMercury; 28.01.2017 в 18:26.
Старый 28.01.2017, 18:46
zackscript вне форума Посмотреть профиль Отправить личное сообщение для zackscript Найти все сообщения от zackscript
  № 5  
Ответить с цитированием
zackscript
 
Аватар для zackscript

Регистрация: Jan 2014
Сообщений: 181
Отправить сообщение для zackscript с помощью Skype™
Так ну теперь кое-что стало понятно, вот тут: pool[i] = new className(); он пока ни знает какой объект класса создает , так...
А здесь: p = pool.getObject() as Point; - заставляет вернуть в место Object тип Point (мой/пользовательский)

Старый 28.01.2017, 18:51
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 6  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Нет, он возвращает Object, который на самом деле Point, и этим
Код AS3:
pool.getObject() as Point
вы говорите машине исполнения, что возвращаемый объект на самом деле не Object, а его потомок, и вы хотите использовать его как Point(вызывать методы и свойства Point у этого объекта).
Всё это написано в документации, товарищ.
__________________
There is no thing in this world that is not simple.

Старый 28.01.2017, 18:55
zackscript вне форума Посмотреть профиль Отправить личное сообщение для zackscript Найти все сообщения от zackscript
  № 7  
Ответить с цитированием
zackscript
 
Аватар для zackscript

Регистрация: Jan 2014
Сообщений: 181
Отправить сообщение для zackscript с помощью Skype™
Спасибо товарищ ) теперь ясно.
Цитата:
Всё это написано в документации, товарищ.
Тока где ?! (риторический вопрос)

Старый 28.01.2017, 19:08
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 8  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Цитата:
Тока где ?!
http://help.adobe.com/ru_RU/FlashPla...rators.html#as
http://help.adobe.com/ru_RU/ActionSc...0204-7f8a.html
Немного недописано, действительно, что оператор на самом деле делает. Но я точно помню, что где-то читал, либо в книге Колина Мука, либо в документации)
__________________
There is no thing in this world that is not simple.

Старый 28.01.2017, 19:15
zackscript вне форума Посмотреть профиль Отправить личное сообщение для zackscript Найти все сообщения от zackscript
  № 9  
Ответить с цитированием
zackscript
 
Аватар для zackscript

Регистрация: Jan 2014
Сообщений: 181
Отправить сообщение для zackscript с помощью Skype™
Код AS3:
public var myArray:Array = ["one", "two", "three"];
trace(myArray as Array);  // one,two,three
trace(myArray as Number); // null
trace(myArray as int);    // null
Данный пример - это просто убожество.
Хотя много раз видел этот пример.

Добавлено через 35 минут
ZackMercury, ещё один вопрос , если тип возвращаемого объект я присвою заранее то и не нужно приведение ?
Код AS3:
public function getObject():Point
    {
        if ( counter > 0 )
            return pool[ --counter ];
        // если объекты закончились
        // создаю объект и увеличивая длину массива
        pool.unshift( new className() );
        return pool[0];
    }
p.s. возможности тестирования пока нет )

Старый 28.01.2017, 22:41
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 10  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
тогда
Код AS3:
public function getObject():Point
    {
        if ( counter > 0 )
            return pool[ --counter ] as Point;
        // если объекты закончились
        // создаю объект и увеличивая длину массива
        pool.unshift( new className() );
        return pool[0] as Point;
    }
__________________
There is no thing in this world that is not simple.

Создать новую тему Ответ Часовой пояс GMT +4, время: 06:15.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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