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
|