![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
[+1.4 18.06.07]
Регистрация: May 2007
Адрес: Moscow
Сообщений: 263
|
В продолжение ставшей модной темы копирования объектов:
Пытаюсь скопировать объект у которого 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{}
}
}
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);
}
}
}
![]()
__________________
А я Томат. Последний раз редактировалось Torero; 15.03.2008 в 20:14. |
|
|||||
|
Регистрация: Jun 2005
Сообщений: 104
|
вызываемая функция - приватный метод, может из-за этого...
|
|
|||||
|
[+1.4 18.06.07]
Регистрация: May 2007
Адрес: Moscow
Сообщений: 263
|
Изменил на "public" - ничего не изменилось.
Я как-то не так вызываю ф-и "writeDynamicProperty" и "writeDynamicProperties".(выделил строки)
__________________
А я Томат. Последний раз редактировалось Torero; 15.03.2008 в 20:15. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
А знаете ли вы, что такое интерфейсы и с чем их едят? Что вы ожидаете от вызова абсолютно пустого метода?
|
|
|||||
|
Modus ponens
|
Интерфейс - это не более чем список методов, которые можно вызвать у класса его использующего. Нужен а. для того, чтобы человек работающий с чужим классом мог быстро узнать, какие методы есть у класса. б. чтобы писать несколько похожих по функционалу классов и не забыть случайно реализовать какую-нибудь функцию у них.
В вашем примере вы реализовываете ф-цию из и-фейса: Только она ничего не делает Очевидно то, что вы пытаетесь получить.
__________________
Hell is the possibility of sanity |
|
|||||
|
[+1.4 18.06.07]
Регистрация: 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);
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{}
}
}
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, время: 23:34. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|