Как использовать метод одного объекта для обновления переменной в другом объекте?

Я не уверен, правильно ли я сформулировал вопрос, однако у меня есть код для его детализации. Во-первых, у меня есть класс 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 ответ

Ваша проблема в том, что это не переменная 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);
Другие вопросы по тегам