Files
tianrunCRM/Assets/trCRM/upgradeRes4Dev/priority/lua/public/class.lua
2020-07-04 14:41:25 +08:00

149 lines
3.8 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---@class ClassBase
---@field public super ClassBase
local m = {}
function m.new()
end
function m:ctor(...)
end
---public 包装函数给c#用
function m:wrapFunc(func)
end
function m:wrapFunction4CS(func)
end
---public 创建类
---使用例:
--[[
A = class("A") -- 创建类A
function A:func1()
print("I'm A call func1")
end
function A:func2()
print("I'm A call func2")
end
------------------------------
B = class("B", A) -- 创建类B,继承A
function B:func1() -- 重载func1并且调用父类的func1注意使用方式
B.super.func1(self)
print("I'm B call func1")
end
function B:func3()
print("I'm B call func3")
end
------------------------------
C = class("C", B) -- 创建类C,继承B
function C:func1() -- 重载func1并且调用父类的func1注意使用方式
C.super.func1(self)
print("I'm C call func1")
end
------------------------------
-- 测试
local obj = C.new()
obj:func1()
obj:func2()
obj:func3()
-- 运行结果
LUA: [debug]:I'm A call func1
LUA: [debug]:I'm B call func1
LUA: [debug]:I'm C call func1
LUA: [debug]:I'm A call func2
LUA: [debug]:I'm B call func3
--]]
---@param classname string 类名
---@param super table 基类也是用class方法创建的类可以不传
function class(classname, super)
local superType = type(super)
local cls
if superType ~= "function" and superType ~= "table" then
superType = nil
super = nil
end
if superType == "function" or (super and super.__ctype == 1) then
-- inherited from native C++ Object
cls = {}
if superType == "table" then
-- copy fields from super
for k, v in pairs(super) do
cls[k] = v
end
cls.__create = super.__create
cls.super = super
else
cls.__create = super
end
cls.ctor = function()
end
cls.__cname = classname
cls.__ctype = 1
function cls.new(...)
local instance = cls.__create(...)
-- copy fields from class to native object
for k, v in pairs(cls) do
instance[k] = v
end
instance.class = cls
instance:ctor(...)
return instance
end
else
-- inherited from Lua Object
if super then
--cls = clone(super)
cls = {}
setmetatable(cls, {__index = super})
cls.super = super
else
cls = {
ctor = function()
end
}
end
cls.__cname = classname
cls.__ctype = 2 -- lua
cls.__index = cls
---public 包装函数给c#用
function cls:wrapFunc(func)
return self:wrapFunction4CS(func)
end
---public 包装函数给c#用
function cls:wrapFunction4CS(func)
if func == nil then
return nil
end
if self.__wrapFuncMap == nil then
self.__wrapFuncMap = {}
end
local infor = self.__wrapFuncMap[func]
if infor == nil then
infor = {instance = self, func = func}
self.__wrapFuncMap[func] = infor
end
return infor
end
function cls.new(...)
local instance = setmetatable({}, cls)
instance.class = cls
instance.__wrapFuncMap = {}, -- 包装函数缓存
instance:ctor(...)
return instance
end
end
return cls
end