Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 在AS3中动态创建多个只读属性_Flash_Actionscript 3_Private_Dynamically Generated - Fatal编程技术网

Flash 在AS3中动态创建多个只读属性

Flash 在AS3中动态创建多个只读属性,flash,actionscript-3,private,dynamically-generated,Flash,Actionscript 3,Private,Dynamically Generated,我有一节课,目前相当混乱/重复: public class AvFramework extends Object { // vars private var _handler:AvHandler; private var _keyboard:AvKeyboard; private var _manager:AvManager; /** * Constructor */ public function AvFramework()

我有一节课,目前相当混乱/重复:

public class AvFramework extends Object
{
    // vars
    private var _handler:AvHandler;
    private var _keyboard:AvKeyboard;
    private var _manager:AvManager;

    /**
     * Constructor
     */
    public function AvFramework()
    {
        _handler = new AvHandler();
        _keyboard = new AvKeyboard();
        _manager = new AvManager();

        // attach
        _handler.framework = this;
        _keyboard.framework = this;
        _manager.framework = this;
    }

    /**
     * Getters
     */
    public function get keyboard():AvKeyboard{ return _keyboard; }
    public function get manager():AvManager{ return _manager; }
}
这个类只需要使用越来越多的类,我真的不想像上面这样有3个巨大的列表

是否有一种方法可以动态执行上述操作?可能在字符串循环中使用
getDefinitonByName()
来表示我要创建的类

我还希望属性是只读的,并且可以通过
framework.myDynamicVarHere
访问

我的想法是这样的:

  • 我创建了一个要创建实例的类列表,并与它们应该访问的变量名配对
  • 我需要使类成为动态的,这样我就可以通过
    这个[“var”]=newblah()设置变量
  • 关于我的想法走向的简短片段:

    var required:Object =
    {
        keyboard: "avian.framework.background.AvKeyboard",
        manager: "avian.framework.background.AvManager",
        handler: "avian.framework.background.AvHandler"
    };
    
    var i:String;
    for(i in required)
    {
        var Req:Class = Class(getDefinitionByName(required[i]));
    
        this[i] = new Req();
        AvFrameworkObject(this[i]).framework = this;
    }
    

    只是不确定如何将这些设置为只读。

    也许您可以尝试将长长的ClassW列表包装到object中:

    var required:Object =
    {
        keyboard: "avian.framework.background.AvKeyboard",
        manager: "avian.framework.background.AvManager",
        handler: "avian.framework.background.AvHandler"
    };
    ...
    
    public class AvFramework extends Object { 
        private var holder: Object;
    
        public function AvFramework() {
            holder = new Object();
    
            var i:String;
            for(i in required)
            {
                var Req:Class = Class(getDefinitionByName(required[i]));
                var name = //get Class name from required[i] e.g. AvKeyboard from avian.framework.background.AvKeyboard
                holder[name] = new Req();
                holder[name].framework = this;
            }
        }
    
        public var getHolder() { return holder; }
    }
    
    例如,您可以通过
    framework.getHolder()[“AvKeyboard”]
    或甚至通过
    framework.getHolder()[someVar]
    引用
    AvKeyboard
    。所以
    required
    中的所有这些类都是只读的,因为
    holder
    是只读的


    希望这对你有帮助

    您可以使用代理类来控制get/set调用并完成Eugeny89应答。 看或


    在这段代码中,当您执行myavframeworkbj.something时,getProperty()是自动调用的,您可以从“name”变量中获取属性名。

    您应该拥有私有变量holder:Object={};(并且不要在构造函数中初始化它为新对象)如果您想遵循Adobe Styleic标准;for(i in必填)
    不是必需的。使用
    for(vari:String-in-required)
    只初始化字符串一次,并且在for循环之后字符串仍然存在。这条额外的线路给你的唯一好处是。。。还有一行。@cwallenpole是真的,这对我来说更合适@Eugeny89谢谢:)回答得不错-我也有同样的想法,但是通过framework.getHolder()[“things”]通过framework访问一切(从框架对象)。things非常令人不快:(
    var required:Object =
    {
        keyboard: "avian.framework.background.AvKeyboard",
        manager: "avian.framework.background.AvManager",
        handler: "avian.framework.background.AvHandler"
    };
    ...
    
    import flash.utils.Proxy;
    import flash.utils.flash_proxy;
    public dynamic class AvFramework extends Proxy { 
        private var holder: Object = {};
    
        public function AvFramework() {
            var i:String;
            for(i in required)
            {
                var Req:Class = Class(getDefinitionByName(required[i]));
                var name = //get Class name from required[i] e.g. AvKeyboard from avian.framework.background.AvKeyboard
                holder[name] = new Req();
                holder[name].framework = this;
            }
        }
    
        flash_proxy override function getProperty( name: * ): *
        {
            return holder[name];
        }
    
        flash_proxy function setProperty(name:*, value:*):void
        {
            // Do nothing
        }
    }