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