Нашел ли я ошибку в XML-классе AS3? - PullRequest
3 голосов
/ 11 ноября 2010

Давайте изложим несколько фактов заранее:

Livedocs говорит нам, что dynamic классы позволяют нам добавлять переменные-члены и функции-члены. Нам говорят, что все классы в конечном счете происходят от Object, то есть dynamic, и что dynamic классы должны быть явно помечены как таковые - наследование не относится к динамичности.

Объект класса dynamic. Дата - final dynamic класс. XML является final dynamic классом. Вы можете создать свой собственный класс final dynamic, и он должен вести себя (с точки зрения динамических возможностей) точно так же, как XML и Date, выше. На самом деле, final не должен затрагивать проблему вообще, но я включил ее для точности в мое сравнение с «проблемным» классом XML.

Мой код:

public static function setup():void//Object
{
    //Uncomment each in turn to get results:
    //var o:Object = {};
    //var o:MyFinalDynamicClass = new MyFinalDynamicClass();
    //var o:Date = new Date();
    //var o:XML = new XML();

    o.foo = function():String
    {
        return "Works as expected.";
    }

    trace(o.foo());
}

Результаты включения каждой из строк, где определено o:

Объект: Works as expected.

MyFinalDynamicClass: Works as expected.

Дата: Works as expected.

XML: TypeError: Error #1006: value is not a function.

Я использовал Date, поскольку это другой базовый класс, final dynamic. Также обратите внимание, что члены переменные прекрасно работают во всех вышеперечисленных классах. Только члены функции имеют проблемы, и только в классе XML.

Мой вывод заключается в том, что не каждый класс в AS3 является производным от Object, некоторые, вероятно, смоделированы таким образом, но на самом деле получены другим способом в нативном C ++, который, как мне кажется, использует Adobe для написания AS. языки.

ВОПРОС: Видите ли вы недостатки в моей логике? Или этот класс на самом деле прослушивается?

P.S. Для тех, кто интересуется, почему я хотел добавить функции в XML, мне нужен был способ инкапсулировать сложный доступ к моей модели данных XML.

Ответы [ 4 ]

3 голосов
/ 11 ноября 2010

Согласно aliveocs , XML действительно является производным от Object.Более того, я не думаю, что это вообще ошибка, а скорее ожидаемое поведение класса XML.Он просто отвергает ваш метод, потому что это не объект XML.Думайте об этом как проверенное во время выполнения типизированное дерево.Вы можете только получить / установить другие объекты XML.Попробуйте следующий пример:

var foo:XML = <foo><bar /><bar /></foo>;
trace(foo); // Prints <foo><bar /></foo>

foo.bar = <baz />;
trace(foo); // Prints <foo><baz /></foo>

Объект XML является представлением XML-кода в ActionScript, поэтому в действительности получается, что я взял все теги и заменил их одним тегом.Если вы попытаетесь заменить XML чем-то, что не является XML (то есть вашим методом), он не поймет, чего вы хотите, и преобразует значение в строку.В результате вы получите что-то вроде:

<foo>
  <bar>function Function() {}</bar>
</foo>

Вам нужно будет создать оболочку, которая позаботится о вашей обработке.

2 голосов
/ 11 ноября 2010

Это не ошибка. Объект e4x позволяет вам манипулировать дочерними элементами XML dom, используя обычную запись объекта. Это дополнительно уточняется на здесь . Таким образом, когда вы назначаете функцию атрибуту объекта XML, функция преобразуется в строку, а затем строка добавляется в документ XML как текстовое значение элемента <foo>.

Еще одна особенность e4x заключается в том, что без элемента корневого уровня он более или менее игнорирует любые попытки установить дочерние элементы. Поэтому рассмотрим следующее:

var o:XML = new XML('<document/>');

o.foo = function():String {
    return "Works as expected.";
};

trace(o.toXMLString());

печать:

<document>
    <foo>function Function() {}</foo>
</document>

Еще один объект Actionscript3, который работает следующим образом: Proxy . Прокси не является окончательным, что позволит вам создать свой собственный класс, который работает так же, как класс e4x XML.

0 голосов
/ 11 ноября 2010

Я не думаю, что есть способ обойти эту ошибку.Вы совершенно правы, но в то же время, как бы они реализовали логику E4X, если бы xml не был динамическим, если бы он не был динамическим, он не был бы способен к функциям E4X.в то же время я думаю, что они добавили эту логику в объект, чтобы пользователи не путались с методами, которые XML не поддерживает таким образом, как динамика, которая на самом деле не полностью динамична.

0 голосов
/ 11 ноября 2010

Я думаю, что вы, вероятно, столкнулись с некоторой проблемой, связанной с E4X, так что да, я бы согласился, что это, вероятно, ошибка.

Вы сможете разместить его в системе Adobe Jira по адресу: http://bugs.adobe.com/jira/browse/FP

...