Lua 實現C#中的類

直接上代碼:

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
在輸出結果中可以看到,HaShiQiJinMao具有AnimalDog的屬性,而BoSiMao只有Animal的屬性。
此文只是提供一個簡單的用Lua實現類的大體思路,具體實現方式可以自由擴展

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章