Путаница здесь проистекает из своеобразной тонкости того, как AS3 обрабатывает типы и числа. Оператор is
проверяет наследование классов, но int
и uint
на самом деле не являются классами. (Вот почему они не получают заглавных букв - потому что у них нет определения класса.) Они больше похожи на ассоциации типов, которые при правильном использовании могут принести вам определенные удобства и улучшения производительности. Но для целей наследования число есть число есть число.
На практике это означает, что если вы создаете переменную, например, типа uint
, то Flash будет хранить это значение внутри себя в 32-битном формате без знака (а не в 64-битном формате, используемом для Number
). ). И если вы измените значение этой переменной, оно останется в том же формате, поэтому ограничения на uint
будут применены:
var a:uint = 0;
a--;
trace(a); // 4294967295 - it wrapped around
Но на самом деле ссылка на ваш номер набирается как uint
, а не само число. Если вы сделаете новую нетипизированную ссылку, это будет очевидно:
var a:uint = 0;
var b:* = a;
b--
trace(b); // -1
Итак, чтобы вернуться к вашей проблеме, как вы должны реализовать свой буферный писатель? Из-за врожденной тонкости в том, как Flash обрабатывает эти типы, я не думаю, что есть абсолютно правильный ответ. Один из подходов состоит в том, чтобы использовать uint
или int
, если данные соответствуют ограничениям для этих типов, и использовать Number
в противном случае. Это сохранит память и сохранит точность. Но отношение ко всем числам как Number
также кажется мне оправданным подходом. Я думаю, это зависит от того, что вы планируете делать с буфером.