访问受保护或私有财产

Posted

技术标签:

【中文标题】访问受保护或私有财产【英文标题】:Accessing protected or private property 【发布时间】:2012-06-22 14:35:55 【问题描述】:

在 ActionScript 3 中有一种方法(hack - 可能通过方括号,可能通过克隆对象,可能通过原型,可能通过命名空间,...)来更改私有或受保护班级成员?

例如,如果我有一个由 someLibrary.swc 提供的 IconToast 类,并且我知道它有一个

    protected var windowOptions:WindowOptions;

我可以改变它吗?我尝试了很多东西,例如:

        var errorToast:IconToast = new IconToast();
        errorToast.addButton("Dismiss");
        errorToast.message = "Error when connecting";
        errorToast['windowOptions'].timeout = 10 * 1000;
        errorToast.show();

(给我运行时错误ReferenceError: Error #1069: Property windowOptions not found on IconToast and there is no default value)。

【问题讨论】:

意味着它只能被扩展它的类访问。您不扩展它,而是创建它的变量实例。 【参考方案1】:

通过扩展基类并提供对私有/受保护方法/属性等的公共访问权限来做到这一点。

public class MyIconToast extends IconToast

    public function getWindowOptions():WindowOptions
    
        return windowOptions;//here you can access protected (not private though:);
    

对于私人来说,这可能是不可能的,但在某种程度上类似于上述解决方案是可以做到的

最好的问候

【讨论】:

这是最好的方法。另一种方法是在加载 swf 之前修改 ABC。【参考方案2】:

不,没有办法直接改变它的修饰符(这就是为什么它被定义为公共的、受保护的和私有的,对吧?)。 Lukasz 'Severiaan' Grela 的解决方案还可以,但可以更好:使用 getter/setter 检索读/写函数。

public function set windowOption(option:int):void;

public function get windowOption():int;

并且私有属性只属于它们的类,所以如果它们被打包到 SWC 中,你就看不到它们中的任何一个:D。

【讨论】:

以上是关于访问受保护或私有财产的主要内容,如果未能解决你的问题,请参考以下文章

受保护和私有有啥区别? [复制]

是否可以为具有 1)返回类型 void、2)访问说明符私有或受保护的方法编写单元测试?

哪个功能,受保护的或私有的更安全? [复制]

Java通过受保护的getter访问私有超类成员

从 TYPO3 v9 升级到 v10 后:显示页面不再工作(无法访问受保护的财产)

向某些类公开受保护/私有属性