149 lines
3.8 KiB
Lua
149 lines
3.8 KiB
Lua
---@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
|