Литерал объекта с константами в качестве ключей (в паре ключ-значение) - PullRequest
3 голосов
/ 05 апреля 2011

У меня есть класс, который содержит некоторые константы и получит литерал объекта (ассоциативный массив) с некоторыми данными, подобными этим:

var ConfigObj:Config = new Config({
    "Some" : 10,
    "Other" : 3,
    "Another" : 5
});

Класс выглядит так:

public dynamic class Config
{
    static public const SomeProperty:String = "Some";
    static public const OtherProperty:String = "OtherProperty";
    static public const AnotherProperty:String = "AnotherProperty";

    public function Config(settings:Object)
    {
        // Doing some stuff here
    }
}

Проблема в том, как я могу передать константы в виде ключей , например:

var ConfigObj:Config = new Config({
    Config.SomeProperty : 10,
    Config.OtherProperty : 3,
    Config.AnotherProperty : 5
});

Кроме того, я хотел бы, чтобы это было возможно, если возможно.

var MyObj:MyClass = new MyClass({x:1, y:2, z:3});

для меня намного лучше, чем:

var Temp:Object = new Object();
Temp.x = 1; // Or Temp[x] = 1;
Temp.y = 2; // Or Temp[y] = 2;
Temp.z = 3; // Or Temp[z] = 3;

var MyObj:MyClass = new MyClass(Temp);

Ответы [ 2 ]

2 голосов
/ 05 апреля 2011

Мне кажется, что вы чрезмерно усложняете свой объект конфигурации, однако, если вы хотите использовать константы для установки пар ключ-значение, вам нужно будет использовать временную переменную:

var o:Object, configObj:Config;
o = {};
o[Config.SomeProperty] = 'foo';
o[Config.OtherProperty] = 'bar';
o[Config.AnotherProperty] = 'baz';

configObj = new Config( o );

Важный вопрос: действительно ли эти свойства постоянны?Если это так, тогда существует небольшой риск использования строкового литерала при создании экземпляра объекта:

new Config( { 'SomeProperty':'foo', 'OtherProperty':'bar', 'AnotherProperty':'baz' } );

Конечно, это не является гибким, если значения в константах изменяются.

0 голосов
/ 05 апреля 2011

Если вы хотите обеспечить проверку типа и именование параметров, вы не должны использовать dynamic class или передавать Object, но вы должны кодировать Config class со всеми доступными возможностями. Возврат Config class при настройке пареметра позволит вам встроить вызов. Требуется больше работ, но это безопаснее, ИМХО.

Ex:

class Config {
    protected var _somePropertySet:Boolean
    public function get isSomePropertySet():Boolean{
        return _somePropertySet
    }
    protected var _someProperty:String;
    public function setSomeProperty(value:String):Config{
        _somePropertySet=true
        _someProperty = value
        return this
    }
    public function get someProperty():String{
        return _someProperty
    }

    protected var _someOtherPropertySet:Boolean
    public function get isSomeOtherPropertySet():Boolean{
        return _someOtherPropertySet
    }
    protected var _someOtherProperty:int;
    public function setSomeOtherProperty(value:int):Config{
        _someOtherPropertySet=true
        _someOtherProperty = value
        return this
    }

    protected var _someAnotherPropertySet:Boolean
    public function get isSomeAnotherPropertySet():Boolean{
        return _someAnotherPropertySet
    }
    protected var _someAnotherProperty:Object;
    public function setSomeAnotherProperty(value:Object):Config{
        _someAnotherPropertySet=true
        _someAnotherProperty = value
        return this
    }
}

class Tmp {
    public function Tmp(config:Config) {
        initFromConfig(config)
    }

    protected function initFromConfig(config:Config):void {
        if (config.isSomePropertySet){
            //..
        }
        if (config.isSomeOtherPropertySet){
            //..
        }
        if (config.isSomeAnotherPropertySet){
            //..
        }
    }
}
var t:Tmp=new Tmp(new Config().setSomeProperty("foo").setSomeOtherProperty(5).setSomeAnotherProperty(null))
...