Конфликтующий охват: глобальные функции и методы класса с тем же именем - PullRequest
3 голосов
/ 06 июля 2011

Мой вопрос касается непосредственно ActionScript 3, хотя он может отображаться и на других языках.

Рассмотрим глобальную функцию trace , обнаруженную в AS3.Вызов метода не требует импорта и доступен во всех классах.

class A {

    public function A() {
        trace("Hello, A!"); // Hello, A!
    }

}

А что если я создам свой собственный метод класса с тем же именем?В AS3, если у меня есть метод класса trace , а затем выполняется вызов trace в другом месте моего класса, вызов метода класса выполняется через глобальную функцию.По сути, я заблокировал свою способность вызывать метод глобальной трассировки.

class B {

    public function B() {
        trace("Hello, B!"); // no output
    }

    public function trace(s:String):void {
        // do something else.
    }

}

Теперь я знаю очевидный ответ: «не создавайте метод класса с именем trace * 1016».* «.Но что, если я не знаю о существовании глобальной функции trace ?Или что, если у меня есть желание "переопределить" или "заблокировать" глобальную функцию?Это так плохо программирование?Или это просто еще один пример того, как AS3 является плохим объектно-ориентированным языком?

Ответы [ 4 ]

2 голосов
/ 10 октября 2012

импорт flash.uitls. *;

тогда вы можете использовать

(getDefinitionByName('trace') as Function)('Global trace.');
1 голос
/ 06 июля 2011

Если ваша функция trace не была public, вы могли бы использовать public пространство имен для вызова исходной функции:

class B {
    public function B() {
        // call the trace function that is defined in the public namespace
        public::trace("Hello, B!"); // output "Hello, B!"
    }

    // here the function is protected so not into the public namespace
    protected function trace(s:String):void {
        // do something else.
    }
}
0 голосов
/ 21 октября 2011

Альтернативным методом было бы изменить место, где происходит привязка имени к глобальному идентификатору, как в случае следующего класса-оболочки:

class B {
    public function B() {
        Globals.global_trace("Hello, B!"); // delegates to global trace()
    }
    public function trace(s:String):void {
        // do something else.
    }
}

class Globals {
    public function global_trace(...args) {
        // class B's identifiers are now irrelevant for the name lookup
        trace.apply(null, args);
    }
}

Более локализованный подход заключается в повторной привязке глобального символа доскрывая это:

private static var _trace:* = trace; // rebind global trace

public function trace(...args) {
    _trace.apply(null, args);
}
0 голосов
/ 06 июля 2011

«Но что, если я не знаю о существовании глобальной функции трассировки?»

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

...