Lua 實現C 中的類

2021-10-05 09:22:33 字數 2844 閱讀 9299

直接上**:

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

在輸出結果中可以看到,hashiqijinmao具有animaldog的屬性,而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 遞迴呼叫建構函式,實現構造基類的資料...