直接上代碼:
class.lua
local mt = {}
function class(clsName, base)
local cls = {}
base = base or mt
setmetatable(cls, {__index = base})
cls.clsName = clsName or "default"
cls.base = base
cls.new = function(...)
local cls_instance = {}
setmetatable(cls_instance, {__index = cls})
if cls_instance.onCreate then
cls_instance:onCreate(...)
end
return cls_instance
end
return cls
end
主要是通過lua
中原方法實現繼承關係,class
作爲一個全局函數,在class
函數中爲聲明一個新的類,並聲明new
函數作爲模擬C#中 new XXX(...)
語法,使用方法爲XXX.new(...)
生成對應類的實例。在不同的開發需求中,可以根據需求不同,在new
函數中實現不同的邏輯,例如上面代碼中的onCreate
就是在聲明一個類的實例時候調用的,可以理解爲構造方法。另外在具體的開發需求中,默認mt
也可以根據需求來定製,爲類添加默認屬性。
test.lua
-- 動物類
local Animal = class("Animal")
Animal.onCreate = function(self, name)
self.name = "動物->" .. (name or "默認動物")
end
Animal.eat = function(self)
print("動物(Animal)吃")
end
-- 狗類
local Dog = class("Dog", Animal)
Dog.onCreate = function(self, name)
self.name = "狗->" .. (name or "無名氏")
end
Dog.eat = function(self)
print("狗(Dog) 吃")
end
Dog.bark = function(self)
print("叫(Dog)")
end
Dog.drink = function(self)
print("喝(Dog)")
end
-- 金毛
local JinMao = class("JinMao", Dog)
JinMao.bark = function(self)
print("叫(JinMao)")
end
-- 哈士奇
local HaShiQi = class("HaShiQi", Dog)
HaShiQi.drink = function(self)
print("喝(HaShiQi)")
end
-- 波斯貓
local BoSiMao = class("BoSiMao", Animal)
BoSiMao.bark = function(self)
print("喵~")
end
print("---------------- 金 毛 ----------------")
local jinMao = JinMao.new("金毛 - 豆豆")
jinMao:eat()
jinMao:bark()
jinMao:drink()
print("---------------- 哈士奇 ----------------")
local haShiQi = HaShiQi.new("哈士奇 - 二哈")
haShiQi:eat()
haShiQi:bark()
haShiQi:drink()
print("---------------- 波斯貓 ----------------")
local boSiMao = BoSiMao.new("波斯貓 - 莎莎")
boSiMao:eat()
boSiMao:bark()
--[[ 輸出結果
---------------- 金 毛 ----------------
狗(Dog) 吃
叫(JinMao) 狗->金毛 - 豆豆
喝(Dog)
---------------- 哈士奇 ----------------
狗(Dog) 吃
叫(Dog)
喝(HaShiQi) 狗->哈士奇 - 二哈
---------------- 波斯貓 ----------------
動物(Animal)吃
喵~ 動物->波斯貓 - 莎莎
[Finished in 0.1s]
]]
在測試代碼中,繼承關係如下:
HaShiQi/JinMao : Dog : Animal
BoSiMao : Animal
在輸出結果中可以看到,HaShiQi
和JinMao
具有Animal
和Dog
的屬性,而BoSiMao
只有Animal
的屬性。
此文只是提供一個簡單的用Lua實現類的大體思路,具體實現方式可以自由擴展