2010-04-05 12 views
5

मैं AS3 में Mixin/Trait स्टाइल सिस्टम को कार्यान्वित करने के तरीकों की तलाश में हूं।मिक्सिन या ट्राइट कार्यान्वयन?

मैं एक वर्ग में कई वर्गों को एक साथ लिखने में सक्षम होना चाहता हूं। बेशक यह एएस 3 की भाषा स्तर की विशेषता नहीं है, लेकिन मुझे आशा है कि प्रोटोटाइप आधारित तकनीकों या शायद कुछ बाइटकोड हैकिंग का उपयोग करके ऐसा करने का कोई तरीका हो सकता है, जो मुझे लगता है कि AsMock इसकी कार्यक्षमता को लागू करने के लिए उपयोग करता है।

एक मौजूदा जावा उदाहरण Qi4J है जहां उपयोगकर्ता इंटरफेस को परिभाषित करता है जो Qi4j ढांचे को मेटाडेटा टैग और सम्मेलन द्वारा कोडिंग के आधार पर लागू करता है।

क्या किसी को भी एएस 3 के भीतर मिक्सिन/ट्राइट अवधारणा को काम करने के बारे में कोई विचार है?

उत्तर

7

इस पर प्रस्तुत शून्य समाधान, इसलिए मैंने कुछ तरीकों को देखा। बेस ऑब्जेक्ट्स प्रोटोटाइप पर अन्य ऑब्जेक्ट्स पर परिभाषित विधियों को जोड़कर ECMA script style mixins हैं। लेकिन इसका मतलब है कि स्थैतिक टाइपिंग के फायदे चले गए हैं।

मैं ऐसे समाधान की तलाश में था जो स्थैतिक प्रकार प्रणाली को कम नहीं करता था। मुझे पता था कि ASMock प्रॉक्सी वर्ग बनाने के लिए बाइटकोड इंजेक्शन का उपयोग किया जाता है। मैंने पिछले कुछ दिनों से ASMock के आसपास हैक किया और रचनाकृत कक्षाओं (बाइटकोड इंजेक्शन के माध्यम से) के साथ कक्षा बनाने के द्वारा लागू संभावित समाधान के साथ आया। एक सामान्य स्थिति है जहाँ में

public class MoveableImpl implements Moveable 
{ 
    private var _location:Point = new Point() 
    public function get location():Point { return _location } 

    public function move(location:Point):void 
    { 
     _location = location.clone() 
    } 
} 

public class RoomObjectImpl implements RoomObject 
{ 
    private var _room:Room 
    public function get room():Room { return _room } 

    public function joinRoom(room:Room):void 
    { 
     _room = room 
    } 
} 

:

public interface Person extends RoomObject, Moveable 

public interface RoomObject 
{ 
    function joinRoom(room:Room):void 
    function get room():Room 
} 

public interface Moveable 
{ 
    function moveTo(location:Point):void 
    function get location():Point 
} 

तो फिर तुम वर्गों को परिभाषित इन इंटरफेस का प्रतिनिधित्व करने के लिए:

उपयोगकर्ताओं से देखने के इस अपने वस्तु कई इंटरफेस के माध्यम से mixins का उपयोग करता है निर्धारित करना पड़ता है बात आप उन वर्गों को लिखना चाहते हैं जिन्हें आप लिखेंगे:

public class PersonImpl implements Person 
{ 
    private var _roomObject:RoomObject = new RoomObjectImpl() 

    private var _moveable:Moveable = new MoveableImpl() 

    public function get room():Room { return _roomObject.room } 

    public function joinRoom(room:Room):void { _roomObject.joinRoom(room) } 

    public function get location():Point { return _moveable.location } 

    public function move(location:Point):void { _moveable.move(location) } 
} 

यह नियमित लेआउट के कारण आसानी से कोड का उपयोग करके लिखा जाता है। और यह वही है जो मेरा समाधान करता है, समकक्ष बाइटकोड को एक नई कक्षा में इंजेक्शन देकर। इस बाईटकोड इंजेक्शन प्रणाली के साथ हम तो जैसे एक व्यक्ति वस्तु बना सकते हैं:

public class Main 
{ 
    private var mixinRepo:MixinRepository = new MixinRepository() 

    public function Main() 
    { 
     with(mixinRepo) 
     { 
      defineMixin(RoomObject, RoomObjectImpl) // associate interfaces with concreate classes 
      defineMixin(Moveable, MoveableImpl) 
      defineBase(Person) 
      prepare().completed.add(testMixins) // the injection is a async process, just liek in ASMock 
     } 
    } 

    private function testMixins():void 
    { 
     var person:Person = mixinRepo.create(Person) 
     var room:Room = new Room('room you can play in') 

     person.joinRoom(room) 
     trace('person.room:', person.room) 

     person.move(new Point(1, 2)) 
     trace('person.location:', person.location) 
    } 
} 

फिलहाल इस प्रणाली की अवधारणा का एक सबूत है और इसलिए बहुत ही बुनियादी और भंगुर है। लेकिन यह दिखाता है कि एएस 3 को स्कैला मिक्सीन/लक्षण शैली प्रणाली के करीब आना संभव है। कोड को पकड़ने के लिए मैंने एक github project बनाया है यदि कोई भी समाधान चलाने में रुचि रखता है और यह कैसे किया जाता है, इस पर चारों ओर पोकिंग करता है।

प्रोजेक्ट wiki पर एक और पूर्ण उदाहरण दिया गया है।

+0

मैंने देखा है कि अपने लिंक काम नहीं कर रहा था, इसलिए मैं उन्हें नवीनीकृत किया है। –

+0

अच्छा, धन्यवाद एंड्रयू;) –

1

यहां देखें, यह काम करता है, तरीकों से मिश्रण करता है और सरल है।

http://github.com/specialunderwear/as3-mixin

ओ, और यह काम करता है जब आप AS3 मोड में संकलित करें।

+0

अच्छा विचार, मैं इसे अपने अगले एएस 3 प्रोजेक्ट पर एक परीक्षण चलाने दूंगा। –

+0

दुर्भाग्यवश, ऐसा करने से टाइप-चेकर में मदद नहीं मिलती है :( –

+0

चूंकि मिश्रित विदेशी वर्ग हैं, जिनके वर्ग में आप जिस तरह से मिश्रित तरीके हैं, उस पर प्रकार का कोई प्रभाव नहीं पड़ता है, यह मिश्रणों की विशेषता है, इस विशेष कार्यान्वयन का नहीं। यदि आप अपनी कक्षा के प्रकार को इसकी कार्यक्षमता (विशिष्ट रूप से) परिभाषित करना चाहते हैं, तो आपको कभी भी मिश्रण का उपयोग नहीं करना चाहिए। – specialunderwear

संबंधित मुद्दे