gpt4 book ai didi

actionscript-3 - AS3 中的 Mixin 或 Trait 实现?

转载 作者:行者123 更新时间:2023-12-04 17:41:37 25 4
gpt4 key购买 nike

我正在寻找有关如何实现 Mixin/Trait 的想法AS3中的样式系统。

我希望能够将多个类组合成一个对象。当然,这不是 AS3 的语言级功能,但我希望可能有某种方法可以使用基于原型(prototype)的技术或我相信 AsMock 用来实现其功能的一些字节码黑客技术来做到这一点。

一个现有的 Java 示例是 Qi4J用户定义 Qi4j 框架基于元数据标签和约定编码实现的接口(interface)。

有人对如何在 AS3 中使用 Mixin/Trait 概念有任何想法吗?

最佳答案

对此提出了零解决方案,因此我研究了一些方法。有ECMA script style mixins通过将其他对象上定义的方法添加到基础对象原型(prototype)中。但这意味着静态类型的优势消失了。

我正在寻找一种不回避静态类型系统的解决方案。我知道ASMock使用字节码注入(inject)来创建代理类。我在 ASMock 周围进行了黑客攻击在过去的几天里,想出了一个可能的解决方案,通过创建一个具有组合类的类(通过字节码注入(inject))来实现。

从用户的角度来看,这涉及通过许多接口(interface)定义使用 mixin 的对象:

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
}

然后定义类来表示这些接口(interface):
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) }
}

由于它是常规布局,因此很容易使用代码编写。这正是我的解决方案所做的,通过将等效字节码注入(inject)一个新类。使用这个字节码注入(inject)系统,我们可以像这样创建一个 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上给出了一个更完整的例子。 .

关于actionscript-3 - AS3 中的 Mixin 或 Trait 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2577574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com