Давайте изложим несколько фактов заранее:
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.