apolloxlua class支持示例

简介:

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
相关文章
|
6月前
|
数据管理 测试技术 API
解决 Postman Collection Runner 限制的最佳解决方案
Postman 限制了 Collection Runner 的使用。使用其他的 Postman 替代工具是解决这个问题的最佳方案。
|
9月前
|
存储 前端开发 JavaScript
深入理解 ECMAScript 2024 新特性:Promise.withResolvers
ECMAScript 2024 引入了 `Promise.withResolvers`,简化了手动创建 `Promise` 时管理 `resolve` 和 `reject` 的复杂性。本文详细介绍其设计背景、使用方式,并通过多个实际案例展示其优势。该方法减少了代码冗余和潜在错误,使异步任务管理更加直观和简洁。未来,这一特性有望为前端开发带来更多灵活性和便利性。
165 37
|
8月前
2024阿里云技术年报 基础设施篇
2024阿里云技术年报基础设施篇
215 14
2024阿里云技术年报 基础设施篇
|
6月前
|
数据采集 人工智能 Java
使用 Ollama 本地模型与 Spring AI Alibaba 的强强结合,打造下一代 RAG 应用
使用 Ollama 本地模型与 Spring AI Alibaba 的强强结合,打造下一代 RAG 应用
1264 22
|
算法 安全 网络安全
什么是GMP?
该文章介绍了GMP(GNU Multiple Precision Arithmetic Library),这是一个用于任意精度整数、有理数和浮点数运算的开源库,特别适用于密码学、网络安全和计算代数等领域,以其高性能和优化的算法而著称。
533 2
|
7月前
|
人工智能 数据可视化 前端开发
Probly:开源 AI Excel表格工具,交互式生成数据分析结果与可视化图表
Probly 是一款结合电子表格功能与 Python 数据分析能力的 AI 工具,支持在浏览器中运行 Python 代码,提供交互式电子表格、数据可视化和智能分析建议,适合需要强大数据分析功能又希望操作简便的用户。
837 2
|
9月前
|
安全 数据挖掘 BI
欢迎使用Quick BI,开启您的智能数据分析之旅!
欢迎选择Quick BI作为您的数据分析伙伴!本文将为您介绍一个月全功能免费试用教程,帮助您轻松上手。请确保在PC环境下操作。
886 6
|
12月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
535 22
|
12月前
|
安全 数据库 开发者
告别Navicat:彻底卸载指南及注意事项
【10月更文挑战第12天】 Navicat,作为一款广受数据库管理员和开发者喜爱的数据库管理工具,以其强大的功能和用户友好的界面著称。然而,有时出于各种原因,如软件升级、更换工具或系统维护,我们需要将其从系统中卸载。本文将提供一个详细的Navicat卸载指南,确保卸载过程既彻底又安全。
1212 6