इस पर प्रस्तुत शून्य समाधान, इसलिए मैंने कुछ तरीकों को देखा। बेस ऑब्जेक्ट्स प्रोटोटाइप पर अन्य ऑब्जेक्ट्स पर परिभाषित विधियों को जोड़कर 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 पर एक और पूर्ण उदाहरण दिया गया है।
मैंने देखा है कि अपने लिंक काम नहीं कर रहा था, इसलिए मैं उन्हें नवीनीकृत किया है। –
अच्छा, धन्यवाद एंड्रयू;) –