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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.03.2008, 19:49
Torero вне форума Посмотреть профиль Отправить личное сообщение для Torero Найти все сообщения от Torero
  № 1  
Ответить с цитированием
Torero
[+1.4 18.06.07]
 
Аватар для Torero

Регистрация: May 2007
Адрес: Moscow
Сообщений: 263
По умолчанию Использование интерфейсов IDynamicPropertyWriter и IDynamicPropertyOutput

В продолжение ставшей модной темы копирования объектов:
Пытаюсь скопировать объект у которого 1 из свойств ссылается на функцию - для этого, насколько я понял, в as3 есть вышеупомянутые интерфейсы.
Люди, помогите пожалуйста разобраться - я вообще никогда раньше с интерфейсами не работал, а в инете нет ни единого примера использования этих интерфейсов - уже 1,5 часа голову ломаю. Похоже, что ошибка в синтаксисе, но никак не пойму где.

MyObject.as
Код:
package {
	import flash.net.*
	public dynamic class MyObject implements IDynamicPropertyOutput{
	
	public function writeDynamicProperty(name:String, value:*):void{ }

	public function MyObject(){
		this.prop1=12345;
		this.prop2="string";
		this.prop3=someFunc;
		this.writeDynamicProperty("prop3",someFunc);
	}
	private function someFunc():void{}
	}
}
MyClone.as
Код:
package {
	import flash.utils.*
	import flash.net.*
	public dynamic class MyClone implements IDynamicPropertyWriter{
		public function writeDynamicProperties(obj:Object, output:IDynamicPropertyOutput):void {}

		public function MyClone(){
			var o1:MyObject=new MyObject();
			var o2:Object;
			var ba:ByteArray=new ByteArray();
			ba.writeObject(o1);
			ba.position=0;
			o2=ba.readObject();
			writeDynamicProperties(o2,o1);
			trace(o1.prop1+"	/	"+o2.prop1);
			trace(o1.prop2+"	/	"+o2.prop2);
			trace(o1.prop3+"	/	"+o2.prop3);
		}
	}
}
на 3й трассировке получаю: "function Function() / undefined"
__________________
А я Томат.


Последний раз редактировалось Torero; 15.03.2008 в 20:14.
Старый 15.03.2008, 20:08
Фломастер вне форума Посмотреть профиль Отправить личное сообщение для Фломастер Найти все сообщения от Фломастер
  № 2  
Ответить с цитированием
Фломастер

Регистрация: Jun 2005
Сообщений: 104
вызываемая функция - приватный метод, может из-за этого...

Старый 15.03.2008, 20:11
Torero вне форума Посмотреть профиль Отправить личное сообщение для Torero Найти все сообщения от Torero
  № 3  
Ответить с цитированием
Torero
[+1.4 18.06.07]
 
Аватар для Torero

Регистрация: May 2007
Адрес: Moscow
Сообщений: 263
Изменил на "public" - ничего не изменилось.
Я как-то не так вызываю ф-и "writeDynamicProperty" и "writeDynamicProperties".(выделил строки)
__________________
А я Томат.


Последний раз редактировалось Torero; 15.03.2008 в 20:15.
Старый 15.03.2008, 21:12
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 4  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
А знаете ли вы, что такое интерфейсы и с чем их едят? Что вы ожидаете от вызова абсолютно пустого метода?

Старый 15.03.2008, 21:56
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 5  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Интерфейс - это не более чем список методов, которые можно вызвать у класса его использующего. Нужен а. для того, чтобы человек работающий с чужим классом мог быстро узнать, какие методы есть у класса. б. чтобы писать несколько похожих по функционалу классов и не забыть случайно реализовать какую-нибудь функцию у них.
В вашем примере вы реализовываете ф-цию из и-фейса:
Код:
public function writeDynamicProperty(name:String, value:*):void{ }
Только она ничего не делает
Код:
public function writeDynamicProperty(name:String, value:*):void{ 
this[name] = value;
}
Очевидно то, что вы пытаетесь получить.
__________________
Hell is the possibility of sanity

Старый 16.03.2008, 13:44
Torero вне форума Посмотреть профиль Отправить личное сообщение для Torero Найти все сообщения от Torero
  № 6  
Ответить с цитированием
Torero
[+1.4 18.06.07]
 
Аватар для Torero

Регистрация: May 2007
Адрес: Moscow
Сообщений: 263
2 _etc: Представление об интерфейсах крайне расплывчто, в чем честно и признался в начале топика.
2 wvxvw: Спасибо за разъяснение. Я считал, что в интерфейс вшиваются методы целиком, а не только их заголовки и что интерфейс является неким подобием класса не создающего, при вызове, объекта - поэтому и вызывал функции таким образом.
-----------------------
Код переделал - все-равно не фурычит.

***IDynamicPropertyOutput->writeDynamicProperty***
Adds a dynamic property to the binary output of a serialized object. When the object is subsequently read (using a method such as readObject), it contains the new property. You can use this method to exclude properties of dynamic objects from serialization; to write values to properties of dynamic objects; or to create new properties for dynamic objects.

***IDynamicPropertyWriter->writeDynamicProperties***
This interface is used with the IDynamicPropertyOutput interface to control the serialization of dynamic properties of dynamic objects. To use this interface, assign an object that implements the IDynamicPropertyWriter interface to the ObjectEncoding.dynamicPropertyWriter property.

***ObjectEncoding.dynamicPropertyWriter***
You can use this property to exclude properties of dynamic objects from serialization; to write values to properties of dynamic objects; or to create new properties for dynamic objects. To do so, set this property to an object that implements the IDynamicPropertyWriter interface.


Как я это понял:
1.Класс исходного объекта должен включать интерфейс IDPWriter;
2.Класс клона должен включать интерфейс IDPOutput;
3.Должна быть прописана ссылка "ObjectEncoding.dynamicPropertyWriter" на класс исходного объекта - тогда при запуске метода WriteObject() произойдет перенос динамических свойств в ByteArray, а при вызове метода ReadObject(), их считывание.

Как реализовал:
в кадре:
Код:
var ba:ByteArray;
var o1:MyObject=new MyObject();

ba=new ByteArray();
ba.writeObject(o1);
trace("Размер1: "+ba.length);		//Размер1: 27

ba=new ByteArray();
ObjectEncoding.dynamicPropertyWriter=o1;
ba.writeObject(o1);
					//func1 вызвана
trace("Размер2: "+ba.length);		//Размер2: 58
ba.position=0;

//***дальше ошибка...***
var o2:MyClone=ba.readObject() as MyClone;
trace(o2);
trace(o1.prop1+"  /  "+o2.prop1);
trace(o1.prop2+"  /  "+o2.prop2);
trace(o1.prop3+"  /  "+o2.prop3);
MyObject.as
Код:
package {
import flash.net.*
	public dynamic class MyObject implements IDynamicPropertyWriter{
		
		public function writeDynamicProperties(obj:Object, output:IDynamicPropertyOutput):void {
			trace("func1 вызвана")
			output.writeDynamicProperty("prop1","another very-very-very-very long string")
			output.writeDynamicProperty("prop3",obj.prop3)
		}
		
		public function MyObject(){
			this.prop1=12345;
			this.prop2="string";
			this.prop3=someFunc;
		}
		
		public function someFunc():void{}

	}
}
MyClone.as
Код:
package {
import flash.net.*
	public dynamic class MyClone implements IDynamicPropertyOutput{

		public function writeDynamicProperty(name:String, value:*):void {
			trace("func2")
			this[name]=value;
		}
		
		public function MyClone(){
		}
		
	}
}
В сухом остатке:
Свойства попадают в ByteArray при вызове метода WriteObject(), но не вытаскиваются из него при вызове ReadObject()

Подскажите пжл: как надо перестроить код чтобы он нормально заработал?
__________________
А я Томат.


Последний раз редактировалось Torero; 16.03.2008 в 14:02.
Создать новую тему Ответ Часовой пояс GMT +4, время: 10:08.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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