ActionScript - 确定呼叫者的类?

时间:2011-04-21 12:13:53

标签: actionscript-3 class function call public

MXMLC compiler doesn't support mixed access modifiers for setters/getters以来,我想知道是否从setter类的内部或外部调用了公共setter函数。这种方法应该允许我维护公共财产,但具有更高的安全性,例如公共/私人混合访问。

是否可以使用参数'callee属性,或者其他可能来确定setter是从setter的类内部设置还是从外部设置?

这是我的意思的一个例子:

package
{
//Class
public class MyLocation
    {
    //Constants
    public static const LOCATION_LEFT:String = "locationLeft";
    public static const LOCATION_RIGHT:String = "locationRight";

    //Properties
    private var sideLocationProperty:String;

    //Constructor
    public function MyLocation(sideLocation:String = MyLocation.LOCATION_LEFT)
        {
        this.sideLocation = sideLocation;

        trace(sideLocation);
        }

    //Texture Panel Is Collapsed Setter
    public function set sideLocation(value:String):void
        {
        if  (value != LOCATION_LEFT && value != LOCATION_RIGHT && value != LOCATION_AUTO)
            throw new ArgumentError("\"MyLocation set sideLocation(value:String)\" – value parameter is not supported.");

        sideLocationProperty = value;

        //pseudo code
        if  (arguments.callee is from MyLocation)
            trace("sideLocation was set internally");
            else
            trace("sideLocation was set externally");
        }

    //Texture Panel Is Collapsed Getter
    public function get sideLocation():String
        {
        return sideLocationProperty;
        }
    }
}

4 个答案:

答案 0 :(得分:3)

很可能你不能这样做。

你为什么不写

public function setSideLocation(value:String, caller:* = null):void

那么你可以做任何你想做的事情,比如

trace(caller is MovieClip);

caller.hasOwnProperty(something)

通过将其设置为null作为默认值,您甚至不需要使用它。只是可选。

所以从另一个对象调用它:

object.setSideLocation("something", this);

还要保持一致写

public function getSideLocation():String

答案 1 :(得分:2)

不,不可能。

另外,这是一个非常糟糕的主意。尽量保持你的代码没有副作用,即。你不应该编写故意或意外执行的代码,因为调用者的类。想象一下尝试对这样的代码进行单元测试 - 噩梦。

答案 2 :(得分:0)

是的,AS3的getter和setter已经足够灵活,可以很容易地编写难以理解的代码,因为它们会产生意想不到的副作用,而这个想法只会让它变得更加混乱。 getter或setter的重点是提供一个受控的公共访问点 - 不需要从可以访问私有成员的类中调用getter或setter。

答案 3 :(得分:0)

这是一个老问题,但如果其他人正在寻找...尝试以下内容并解析堆栈跟踪以获取调用者

  

trace(new Error()。getStackTrace())