Как использовать метод одного объекта для обновления переменной в другом объекте? - PullRequest
0 голосов
/ 27 февраля 2012

Я не уверен, правильно ли я сформулировал вопрос, однако у меня есть код для его детализации.Во-первых, у меня есть класс Class1:

public class Class1 
{
    public var S:Number = 0;
    public function Class1() 
    {   
    }
}

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

public class Main extends Sprite
{
    public var class1:Class1 = new Class1;
    public var class2:Class2 = new Class2;

    public function Main():void 
    {
        trace(String(class1.S));
        class2.c2f1(true, class1.S);
        trace(String(class1.S));
    }
}

И я хочу обновить переменную S этого объекта через другуюМетод объекта c2f1, созданный из этого класса:

public class Class2 
{
    public function Class2() 
    {   
    }

    public function c2f1(param1:Boolean, f1:Number):void
    {
        if (param1) f1 = 1;
        trace("c2f1")
    }
}

Вывод выглядит следующим образом:

0
c2f1
0

Где в идеале должно быть:

0
c2f1
1

Это не 'Фактический код, который я использую для любых проектов, я определил проблему в надежде, что мне будет легче увидеть соответствующие концепции.

Надеюсь, кто-нибудь может помочь.:)

1 Ответ

1 голос
/ 27 февраля 2012

Ваша проблема в том, что это не переменная class1.S, которая увеличивается, а ее копия - в AS3 простые типы передаются по значению - то есть Flash создает копию переменной, и это то, что передается вызываемому функция.

Вы можете передать свой объект этой функции:

...
public function c2f1(param1:Boolean, obj:Class1):void
{
    if (param1) obj.S = 1;
    trace("c2f1")
}

Если вам нужно передать несколько разных типов объектов, вы можете вместо этого создать интерфейс и передать его. Тогда ваш класс Class1 может реализовать этот интерфейс, и вы можете вызывать функцию через этот интерфейс для увеличения значения.

Когда вы передаете свой экземпляр Class1, он передается по ссылке, потому что это сложный тип, поэтому вы можете изменять его переменные-члены.

Кроме того, ваша функция может просто возвращать 1 или 0, а затем вы можете присвоить это S:

...
public function c2f1(param1:Boolean):int
{
    trace("c2f1")
    return ( param1 ? 1 : 0 );
}

...
var o1:Class1 = new Class1 ();
var o2:Class2 = new Class2 ();

o1.S = o2.c2f1(bValue);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...