Как получить объект по его идентификатору? - PullRequest
0 голосов
/ 20 ноября 2011

Есть ли способ получить объект по его UID, чтобы сработал следующий код?

Когда функция завершается, значением свойства "xxx" должно быть "строка два", а не "строка один".

// Test class
public function test():void {
    this.xxx = "string one";
    foo.bar(this.xxx);
    trace(this.xxx); // Prints: string two
}

// Foo class
public function bar(value:*):void {
    // ... What would I have to do here to get the property, not its value?
    value = "string two";
}

Ответы [ 4 ]

0 голосов
/ 21 ноября 2011

Передача по значению

При передаче переменной в функцию переменная копируется. Любые изменения, которые вы вносите в переменную, не отражаются после вашего выхода.

Передача по ссылке :

При передаче переменной в функцию передается «указатель» на переменную. Любые изменения, внесенные в переменную, копируются.

В AS3 все передается по ссылке, , за исключением примитивов (Boolean, String, int, uint и т. Д.), Которые имеют специальные операторы за кулисами, чтобы заставить их действовать как обход значение. Поскольку xxx - это строка, это то, что происходит. (Кроме того, строки являются неизменяемыми; вы не можете изменить их значение).

Как это исправить (как говорили другие):

  • Передайте сам объект Test в функцию bar(): bar( this );
  • Инкапсулируйте параметр xxx в свой собственный объект и передайте следующее: bar( {prop:this.xxx} );
  • Пусть bar() вернет значение и установит его: this.xxx = bar();
0 голосов
/ 20 ноября 2011

А как насчет использования скобок Box?Я знаю, что это не ОО способ сделать это, но сценарий Action поддерживает его, и он выглядит здесь как хорошая альтернатива.

class Test {
public var xxx:String;

public function test():void {
    this.xxx = "string one";
    foo.bar(this,"xxx"); // actual name of property as string ;litral
    trace(this.xxx); // Prints: string two
  }
}

class Foo {
public function bar(test:*,prop:String):void {
    //test could be from any class . 
    test[prop] = "string two";
  }
}

Это должно сработать.Но вам нужно убедиться, что любой код, вызывающий метод «bar», передает допустимый объект, для которого определено свойство «xxx», так как этот код больше не является безопасным для типа.

0 голосов
/ 20 ноября 2011

Чтобы добраться до свойства, проще всего заключить свойство в объект, передать его функции, а затем получить его:

// Test class
public function test():void {
    var obj: Object = new Object();
    obj.variable = "string one";
    foo.bar(obj);
    trace(obj.variable); // Prints: string two
}

// Foo class
public function bar(value:Object):void {
    value.variable = "string two";
}

Но почему вы хотите это сделать? Гораздо лучше во всех отношениях просто сделать xxx = foo.bar();

0 голосов
/ 20 ноября 2011

Параметр функции (ссылка на переменную) не может быть изменен. Это не указатель. Вы можете назначить ему другие переменные, но это не изменит аргумент, переданный этой функции. Но вы можете изменить свойства аргумента:

class Test {
    public var xxx:String;

    public function test():void {
        this.xxx = "string one";
        foo.bar(this);
        trace(this.xxx); // Prints: string two
    }
}


class Foo {
    public function bar(test:Test):void {
        test.xxx = "string two";
    }
}

Конечно, чтобы это работало, класс Foo должен знать Test, а также какое свойство изменить. Это делает все менее динамичным и, возможно, не то, что вы хотите. Это тот случай, когда вы можете использовать Interface. Или вы можете придерживаться общих шаблонов, таких как использование геттера и присвоение значения соответствующему свойству:

class Test {
    public var xxx:String;

    public function test():void {
        this.xxx = "string one";
        this.xxx = foo.getValue();
        trace(this.xxx); // Prints: string two
    }
}


class Foo {
    public function getValue():String{
        return "string two";
    }
}
...