apolloxlua 是一个将js翻译到lua的工具。
类:
在apolloxlua.js编程概念里, 类的可见性是在每个文件内部,我们的一个模块/组件/或者一个我们可以称为程序集的概念里, 可能会有大量的类的实体,使用不同的抽象来实现,这些类是构成我们程序的基本单元, 从逻辑设计上来讲,类是最小的隔离单位, 这个粒度基于你所使用的架构设计的分割粒度。我们的类在一个物理文件中对外可见, 需要对外进行包装,这样可以减少全局的内容冲突,实现模块化。
一个应用的结构可能是这样的:
---- app
---module ---- classes
---module -----classes
......
----module -----entrypoint
如何描述和组织这些文件,是物理设计的范畴,我们这里不做任何描述。在web 模式 是不会产生模块的,所有的classses 如果存在某个命名空间里, 那么在内存中的描述是平坦的。在tool模式 如果定义某个类或者模块存在我们的代码文件中,那么会输出一个module同步到NameSpace相同的物理目标文件中,作为模块导出, 同样也需要对外包装。当然这一切都是apolloxlua自动完成的。
定义一个类:
class Person{
hellow(){
console.log("base Person")
console.log(this.age)
}
setAge(v) {
this.age = v;
}
static staticSmethod (...args) {
console.log(args[1], args[2]);
console.log("i am static method");
}
}
处理多态:
如果这个类没有构造函数的话, 系统会自动生成一个构造函数。 如果有则不会处理。 overload 我们不需要那么多的方法,因为参数是支持可变的。 override 如果子类继承了父类,那么子类中和父类相同的方法就会覆盖父类的方法。继承:只支持单继承。在类的内部,所有的方法都是public的。
继承代码:
class Person2 extends Person{
Person2 (name) {
this.name = name;
console.log("constructor..");
}
hellow(){
console.log("override ");
console.log("name=" + this.name + ",age=" + this.age);
}
}
构造函数是和类名相同的一个方法。继承的话需要使用extends关键字和父类的实体名称。 由于类的可见性是基于文件的, 所以我们的继承对象一定定义在这个物理文件中,不然查找不到类实体的符号。static 的方法是可以被子类继承的,static 内部无法使用this关键字。
使用类:
我们可以使用New关键字来访问构造函数,初始化一个实例。
var p1 = Person >>> New();
var p2 = Person2 >>> New("agent.zy");
p1 >>> setAge(10);
p2 >>> setAge(20);
p1 >>> hellow();
p2 >>> hellow();
本示例结果如图:
查看并测试 控制台示例
//[NameSpace("core")]
class Person{
hellow(){
console.log("base Person")
console.log(this.age)
}
setAge(v) {
this.age = v || 0;
}
static staticSmethod (type) {
var instance = 0;
switch (type) {
case "A":
print("A")
instance = Person2 >>> New("wangwb");
instance >>> setAge(21);
break;
case "B":
print("B")
instance = Person >>> New();
instance >>> setAge(22);
break;
}
instance >>> hellow();
}
}
class Person2 extends Person{
Person2 (name) {
this.name = name;
console.log("constructor..");
}
hellow(){
console.log("override ");
console.log("name=" + this.name + ",age=" + this.age);
}
}
Person.staticSmethod("A")
Person.staticSmethod("B")
生成代码
local exports={}
local Person={}
function Person:new(o)
local o=o or {}
setmetatable(o,self)
self.__index= self
return o
end
window.registerStd (0, "Person", Person)
Person.hellow =function (self)
print ("base Person")
print (self.age)
end
Person.setAge =function (self,v)
self.age=v or 0
end
Person.staticSmethod =function (type)
local instance=0
local exports=exports
local CODE547069132834548919H = {
["default"]="CODE54706996767350042H",
["A"]="CODE547069978333147141L",
["B"]="CODE547069137473493932H"
}
if exports["CODE54706996767350042H"] == nil then
exports["CODE547069978333147141L"]=function ()
print ("A")
instance=Person2:new ("wangwb")
instance:setAge (21)
end
exports["CODE547069137473493932H"]=function ()
print ("B")
instance=Person:new ()
instance:setAge (22)
end
end
local __indexer__ = CODE547069132834548919H[type]
if __indexer__ == nil then
__indexer__=CODE547069132834548919H["default"]
end
if exports[__indexer__] ~= nil then
exports[__indexer__]()
end
instance:hellow ()
end
local Person2=Person:new()
function Person2:new(name)
local o=o or {}
setmetatable(o,self)
self.name=name
print ("constructor..")
self.__index= self
return o
end
window.registerStd (0, "Person2", Person2)
Person2.hellow =function (self)
print ("override ")
print ("name="..self.name..",age="..self.age)
end
Person.staticSmethod ("A")
Person.staticSmethod ("B")
运行结果:
compile: 26.882080078125ms
lua.vm.js:1 A
lua.vm.js:1 constructor..
lua.vm.js:1 override
lua.vm.js:1 name=wangwb,age=21
lua.vm.js:1 B
lua.vm.js:1 base Person
lua.vm.js:1 22