如何使用一个对象的方法更新另一个对象中的变量?

时间:2012-02-27 03:26:22

标签: actionscript-3 actionscript

我不确定我是否正确地提出了这个问题,但是,我有代码来详细说明。首先,我有一个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));
    }
}

我想通过从这个类创建的另一个对象的方法c2f1更新该对象的变量S:

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 个答案:

答案 0 :(得分: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);