2011-06-03 14 views
5

में एक से अधिक केवल पढ़ने के लिए गुण बनाना मैं एक वर्ग जो इस समय काफी गंदा है/दोहराव है:गतिशील AS3

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 के माध्यम से पहुंचा जा सके।

मैं कुछ सोच रहा हूँ इन पंक्तियों के साथ:

  1. मैं वर्गों मैं के उदाहरण, चर नाम वे से एक्सेस किया जाना चाहिए के साथ रखा बनाना चाहते हैं की एक सूची बना।

    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; 
    } 
    

    बस सुनिश्चित करें कि नहीं मैं कैसे सक्षम होगा:

  2. मैं कहाँ मेरे विचार जा रहे हैं के माध्यम से this["var"] = new Blah();

के त्वरित टुकड़ा वर्ग dynamic बनाने के लिए तो मैं वार्स सेट कर सकते हैं कि आवश्यकता होगी इन केवल पढ़ने के लिए।

+0

अच्छा सवाल !!! – Eugeny89

+0

यह: 'var i: स्ट्रिंग; (i आवश्यक में) 'आवश्यक नहीं है। 'के लिए (var i: आवश्यक में स्ट्रिंग) 'आप केवल स्ट्रिंग को एक बार प्रारंभ करते हैं और स्ट्रिंग लूप के बाद बनी रहती है। एकमात्र चीज जो अतिरिक्त लाइन आपको मिलती है ... एक अतिरिक्त रेखा है। – cwallenpoole

+0

@cwallenpoole सच है, यह बस मुझे अच्छा लगता है। @ Eugeny89 धन्यवाद :) – Marty

उत्तर

4

आप प्रॉक्सी क्लास का उपयोग प्राप्त/सेट कॉल को नियंत्रित करने और Eugeny89 उत्तर को पूरा करने के लिए कर सकते हैं। http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Proxy.html पर देखो या http://blog.joa-ebert.com/2007/05/25/as3-proxy-example/

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 
    } 
} 
इस कोड के साथ

, आप myAvFrameworkObj.something, getProperty() करना automaticaly फोन है और आप से "नाम" चर संपत्ति नाम प्राप्त हो।

+0

आपके पास होना चाहिए निजी var धारक: ऑब्जेक्ट = {}; (और इसे कन्स्ट्रक्टर में नया ऑब्जेक्ट शुरू नहीं करें) यदि आप एडोब स्टाइलिस्ट मानकों का पालन करना चाहते हैं। – cwallenpoole

+0

क्यों नहीं, धन्यवाद। –

+0

अच्छा जवाब! +1 डाल रहा है! – Eugeny89

1

शायद तुम वस्तु में classws की है कि लंबी सूची लपेटो करने की कोशिश करेंगे:

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; } 
} 

आप जैसे उल्लेख कर सकते हैं AvKeyboardframework.getHolder()["AvKeyboard"] या यहां तक ​​कि framework.getHolder()[someVar] द्वारा। तो required से ये सभी कक्षाएं केवल पढ़ने के लिए हैं, क्योंकि holder केवल पढ़ने के लिए है।

आशा है कि आपकी मदद करेगा!

+0

अच्छा जवाब - मेरे पास एक ही विचार था, हालांकि ढांचे के माध्यम से फ्रेमवर्क.getहोल्डर() ["चीजें"] के माध्यम से सबकुछ (फ्रेमवर्क ऑब्जेक्ट से) तक पहुंच रहा है। चीजें बेहद ऑफ-डाइंग है :( – Marty