Понимание ООП в ActionScript - PullRequest
3 голосов
/ 15 июля 2010
A.as : 

    public class A {

    public function getFunction():Function { 
      return function():void {
        if(this is C) {
          trace("C");
        } else {
          trace("not C");
        }
     }
  }


public function func1():void {
   var internalFunc:Function = getFunction();
   internalFunc();
 }

}

B.as : 
public class B extends A implements C {

}

В каком-то другом классе:

var b:B = new B();
   B.func1();

Вывод: "Не С"

Я ожидал, что результат трассировки будет
"C"

Может кто-нибудь объяснить, почему?

Ответы [ 2 ]

5 голосов
/ 15 июля 2010

Анонимная функция , если вызывается напрямую, распространяется на глобальный объект . Если вы проследите this внутри него, вы увидите [object global] вместо [object B], как если бы это указывало на b.

Обычный обходной путь - использование замыкания:

  var self:A = this;
  return function():void {
    if(self is C) {
      trace("C");
    } else {
      trace("not C");
    }
 }

Обратите внимание, однако, что экземпляры-члены класса, определяющего анонимную функцию, доступны изнутри. Это работает, потому что они разрешаются во время компиляции.

изменить в ответ на вопрос Амаргоша:

Да, this указывает на глобальный объект, но это не значит, что вы не можете получить доступ к членам экземпляра объявленного класса. Этот маленький кусочек кода должен объяснить детали:

package  {
 import flash.display.Sprite;
 public class Test extends Sprite {
  private var foo:String = "foo";
  public function Test() {
   var anonymous:Function = function ():void {
    trace(foo);//foo
    trace(this.foo);//undefined
   };
   anonymous();
  } 
 }
}

Greetz
back2dos

1 голос
/ 15 июля 2010

Несколько вещей с кодом, которые я предполагаю, просто опечатки?

Метод getFunction () ничего не возвращает и, следовательно, вызывает ошибку компилятора.
Ваш код вызова вызывает func1 () как статический метод, а не как метод в экземпляре B. Это также вызовет ошибку компилятора. Я считаю, что это опечатки.

В моих тестах, используя ваш модифицированный код. Вывод C. Должно быть что-то еще происходит с вашим кодом. Вот мои моды на A:

    public function getFunction():Function { 
        if(this is C) {
            trace("C");
        } else {
            trace("not C");
        }
        return getFunction;
    }

Вот мой мод для исполняемого кода, который я поместил в creationComplete пустого файла приложения MXML:

            var b:B = new B();
            b.func1();

Я предполагаю, что ваш код "реального мира" более обширный, чем пример, и должно быть что-то еще.

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