|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: May 2011
Сообщений: 7
|
Передача ссылки на объект в функцию.
Натолкнулся на одну неприятную особенность AS3. Суть ее состоит в следующем: Присвоить объекту, передаваемому в функцию по ссылке, новое значение можно лишь в двух случаях:
1) Когда переопределяются заранее известные свойства этого объекта: function change( target:Point ) { target.x = 300; target.y = 300; } var p:Point = new Point( 100, 100 ); trace( p ); // Выведет (x=100, y=100) change( p ); trace( p ); // Выведет (x=300, y=300), т.к. свойства объекта были переопределены. function change( target:DisplayObject ) { target["p"] = new Point( 300, 300 ); } var p:Point = new Point( 100, 100 ); trace( p ); change( this ); trace( p ); // Данный пример в поле Outputs выведет те же значения, что и в первом случае. Видимо так происходит потому, что в функции вместо ссылки в переменную "target" записывается новый экземпляр класса Point, что не изменяет объект, располагаемый "на другом конце" ссылки. Но не удивительно, что это вообще никаким образом не подходит. Прошу помочь решить. |
|
|||||
function change( target:Point ):Point { return new Point( target.x + 300, target.y + 300 ); } var poin:Point = new Point(100, 100); point = change(point); trace(point); // 400, 400 Цитата:
Добавлено через 6 минут
__________________
тут я Последний раз редактировалось КорДум; 03.08.2011 в 21:39. |
|
|||||
Может быть, вам такой вариант подойдет:
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. Последний раз редактировалось ChuwY; 03.08.2011 в 22:02. |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Судя по тому, что говорите про ссылки - знакомы с С++.
Вот представьте, что у вас в функцию всегда передается указатель на обьект (когда обьект не элементарного типа). Никаких двойных указателей и передачи указателя по ссылке нет. Это as3.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
Регистрация: May 2011
Сообщений: 7
|
Это я приводил пример того что если я знаю имя свойства, то могу с ним сделать именно то, что хочу. И тот экземпляр класса Point просто является свойством на сцене. Да и вполне можно заметить, что в функцию передается далеко не Point ...
Цитата:
Данный способ тоже не подходит, ибо это точка - не настоящее свойство некого класса, а get/set метод. И при попытки определения свойства объекта, возвращаемого get-методом, порой происходят весьма странные вещи. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
preyko, всё передаётся ссылками. Ссылку на сеттер, как функцию, получить невозможно.
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Передается ссылками, только в геттере как раз может быть return new Point(_x, _y); равно как и в сеттере _point = new Point(value.x, value.y);
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: May 2011
Сообщений: 7
|
И вправду. Нельзя передать ссылку на сет метод. Дело то все в том, что аргументом функции change() должен быть экземпляр класса Point, и передавая туда некое свойство, которое по сути set/get метод, мы создаем новый экземпляр, который попадает в функцию вместо ссылки на этот самый метод.
Это демонстрирует следующий пример: function change( target:Star ) { trace( "f", target.p ); target.p = new Point( 200, 100 ); trace( "f", target.p ); } function change1( target:Point ) { trace( "f", target ); target = new Point( 300, 100 ); trace( "f", target ); } var s:Star = new Star( 100, 100 ); trace( s.p ); change( s ); trace( s.p ); trace(); trace( s.p ); change1( s.p ); trace( s.p ); |
Часовой пояс GMT +4, время: 09:52. |
|
« Предыдущая тема | Следующая тема » |
|
|