2011-04-04 35 views
3

我有擁有一些常數和將收到對象文本(關聯陣列)配有一些像這樣的數據的類:對象常量的常量作爲鍵(在密鑰值對)

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); 
+0

其實你的第一個例子將編譯沒有雙引號。它們是可選的(只要密鑰遵循標識符命名規則,就像你的那樣)。不幸的是,{}語法不支持這種「替代」。 – 2011-04-04 21:02:27

+0

我不確定,但我想我明白你想要做什麼(有點)。你可能想看看Flash的Dictionary類;它可能會提供您正在尋找的鍵值對。 – 2011-04-04 22:13:56

回答

2

我開始覺得你是過於複雜的配置對象的感覺,但是如果你想使用常量設置鍵 - 值對,你需要使用一個臨時變量:

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

嗯,我使用常量只是因爲我需要保持代碼的完整性......我不能單純依賴字符串,我需要編譯時檢查,並使用常量來確保。還有一件事是,我希望它是內聯的,創建另一個對象來保持臨時數據不是一個好的方法。 – NemoStein 2011-04-04 20:53:10

+0

@NemoStein,那你爲什麼不使用參數?或者,爲什麼不能直接在Config對象上設置屬性,然後刪除對佔位符對象的需求。希望所有內聯都被高估並且不易讀。 – zzzzBov 2011-04-04 21:02:21

+0

我同意*「被高估並且難以理解」* ...但是,我的老闆不會!關於使用參數,它應該按照特定的順序進行,但我的配置類使用了一長串參數,用戶不應該傳遞每一個參數,甚至不需要進行排序......並將其直接設置在Config對象上會打破「內聯「風格...... – NemoStein 2011-04-04 21:06:30

0

如果你想強制進行類型檢查和參數命名,你不應該使用dynamic class或通過Object,但你應該編碼一個Config class所有可能的可用。 在設置參數表時返回Config class將允許您內聯該呼叫。 它需要更多的作品,但它更安全恕我直言。

例:

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))