2010-04-05 1 views
5

Я ищу идеи о том, как реализовать систему стиля Mixin/Trait в AS3.Внедрение Mixin или Trait в AS3?

Я хочу иметь возможность составлять несколько классов вместе в один объект. Конечно, это не функция уровня языка AS3, но я надеюсь, что это может быть какой-то способ сделать это с использованием прототипов или, возможно, хакеров, которые, как я считаю, используют AsMock для реализации его функциональности.

Существующий пример Java - это Qi4J, где пользователь определяет интерфейсы, которые реализует инфраструктура Qi4j на основе тегов метаданных и кодирования по соглашению.

Есть ли какие-либо идеи о том, как получить концепцию Mixin/Trait, работающую в AS3?

ответ

7

Нулевые решения, представленные на этом, поэтому я рассмотрел несколько методов. Есть ECMA script style mixins, добавляя методы, определенные на других объектах прототипу базовых объектов. Но это означает, что преимущества статического набора текста исчезли.

Я искал решение, которое не уклонилось от системы статического типа. Я знал, что ASMock использует инъекцию для использования в качестве прокси-классов. Последние несколько дней я взломал около ASMock и придумал возможное решение, реализованное путем создания класса с составленными классами (через байтовую инъекцию).

От пользователей точки зрения, это включает в себя определение вашего объекта, который использует Примеси через множество интерфейсов:

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 
} 

Затем определяют классы, чтобы представить эти интерфейсы:

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

Это легко написать с использованием кода из-за его регулярной компоновки. И это именно то, что делает мое решение, введя эквивалентный байт-код в новый класс. С помощью этой системы впрыска байткода мы можем создать объект Person следующим образом:

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

На данный момент эта система представляет собой доказательство концепции, и поэтому очень простой и ломкими. Но это показывает, что к AS3 можно подойти к системе стиля стилей Scala mixin/traits. Я сделал github project, чтобы держать код, если кто-то заинтересован в запуске решения и выкалывании на том, как это было сделано.

Более полный пример приведен в проекте wiki.

+0

Я заметил, что ваши ссылки не работали, поэтому я обновил их. –

+0

Ницца, спасибо Andrew;) –

1

Посмотрите здесь, это работает, смешивается в методах и прост.

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

о, и он работает при компиляции в режиме as3.

+0

Приятная идея, я дам ей пробный запуск моего следующего проекта as3. –

+0

К сожалению, это не помогает методу проверки типов :( –

+0

Так как mixins - это иностранные классы, которые не имеют никакого влияния на тип класса, в котором вы смешиваете методы, что является характеристикой mixins, а не этой конкретной реализации.Если вы хотите, чтобы тип вашего класса определял его функциональность (уникально), вы никогда не должны использовать микшины. – specialunderwear

Смежные вопросы