Как ссылаться на глобальный класс из класса с тем же именем в ActionScript? - PullRequest
0 голосов
/ 10 мая 2009

Из-за требований, не зависящих от меня (не спрашивайте, это смешно), мне нужно создать класс AS3 под названием «Math», который ссылается на класс Global AS Math. Так, например:

package my.package
{
    public class Math
    {
        public static function pow( a:Number, b:Number ):Number {
            // How do I call the Global.as$Math#pow(..) function?
            return Math.pow(a,b);  
        }
    }
}

Приведенный выше код явно неверен - приводит к бесконечной рекурсии. Я не уверен, как сказать, что я хочу делегировать классу Global.as $ Math, а не этому классу Math ...

Мое нынешнее неловкое решение - делегировать другому классу (не названному Math), который проходит через класс Global Math. Есть ли лучший способ сделать это?

Спасибо!

Ответы [ 5 ]

7 голосов
/ 16 мая 2009

Вот еще один способ, который пришёл мне в голову после прочтения поста Джоша Тынялы о том, что package в actionscript - это просто слой абстракции над пространствами имен:

public class Math
{
        namespace globalNs = "";  
        public static function pow( a:Number, b:Number ):Number 
        {
            return globalNs::Math.pow(a, b);  
        }

}

globalNs :: Math.pow явно ссылаются на математический класс верхнего уровня.

2 голосов
/ 10 мая 2009

Сохраните статическую ссылку на объект Math Flash Player и используйте его во всех ваших статических методах:

package test

{ import flash.utils.getDefinitionByName;

public class Math
{
        private static var _flashMath:Class = Class(getDefinitionByName("Math"));  
        public static function pow( a:Number, b:Number ):Number 
        {
            return _flashMath.pow(a, b);  
        }

}

}

1 голос
/ 10 мая 2009

Попробуйте использовать пространство имен AS3 для ссылки на объект AS3 Math. Или ваш класс может просто расширить объект Math, и он будет автоматически иметь все функциональные возможности объекта Math без необходимости переписывать все эти функции-оболочки.

0 голосов
/ 10 мая 2009

Math - это особый случай в AS3, потому что на самом деле он не должен быть глобальным, но это так. Так что, насколько я могу судить, у него нет пространства имен. Решение, которое вы придумали для маршрутизации через другой класс, на самом деле очень умное. Но вы знаете, что на самом деле решение состоит в том, чтобы назвать класс Math2 или MathHelper или MathUtils, а не Math. Пожалуйста, скажите мне, что является причиной вне вашего контроля! Незнание убивает меня !!!

0 голосов
/ 10 мая 2009

Как небольшой ответ на ответ apphackers, вы не можете просто расширить объект Math AS3 и использовать все его функциональные возможности, как было предложено. Статические методы теряются при расширении объекта, поскольку они статически связаны с объектом, который их определяет. Кроме того, вы не можете расширить класс с тем же именем. Однако вы можете добиться успеха с решением для пространства имен, хотя я не уверен, что оно будет работать со статическими методами, мне было бы интересно увидеть ваши результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...