直接上**:
local mt = {}
function class(clsname, base)
local cls = {}
base = base or mt
setmetatable(cls, )
cls.clsname = clsname or "default"
cls.base = base
cls.new = function(...)
local cls_instance = {}
setmetatable(cls_instance, )
if cls_instance.oncreate then
cls_instance:oncreate(...)
endreturn cls_instance
endreturn cls
end
主要是通過lua
中原方法實現繼承關係,class
作為乙個全域性函式,在class
函式中為宣告乙個新的類,並宣告new
函式作為模擬c#中new ***(...)
語法,使用方法為***.new(...)
生成對應類的例項。在不同的開發需求中,可以根據需求不同,在new
函式中實現不同的邏輯,例如上面**中的oncreate
就是在宣告乙個類的例項時候呼叫的,可以理解為構造方法。另外在具體的開發需求中,預設mt
也可以根據需求來定製,為類新增預設屬性。
-- 動物類
local animal = class("animal")
animal.oncreate = function(self, name)
self.name = "動物->" .. (name or "預設動物")
endanimal.eat = function(self)
print("動物(animal)吃")
end-- 狗類
local dog = class("dog", animal)
dog.oncreate = function(self, name)
self.name = "狗->" .. (name or "無名氏")
enddog.eat = function(self)
print("狗(dog) 吃")
enddog.bark = function(self)
print("叫(dog)")
enddog.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("喵~")
endprint("---------------- 金 毛 ----------------")
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實現類的大體思路,具體實現方式可以自由擴充套件
Lua中實現類的原理
1 metatable的中文名叫做元表。它不是乙個單獨的型別,元表其實就是乙個表。2 元表作為乙個表,可以擁有任意型別的鍵值對,其真正對被設定的表的影響是lua規定的元方法鍵值對。這些鍵值對就是lua所規定的鍵,比如 index,add,concat等等。這些鍵名都是以雙下劃線 為字首。其對應的值則...
Lua類的實現
cocos2dx中有關於lua類的實現,見cocos原始碼 framework functions。先講一部分比較難理解的 function class classname,super local cls inherited from lua object if super then cls set...
lua實現類的繼承
local class function class super local class type class type.ctor false class type.super super class type.new function local obj do 遞迴呼叫建構函式,實現構造基類的資料...