直接貼代碼,參考的也是別人的虐急,只不過(guò)其中幾點(diǎn),增加一點(diǎn)自己的理解
http://blog.sina.com.cn/s/blog_89d90b7c0102x9f1.html
local BaseClass = {};
print("BaseClass是"..tostring(BaseClass));
-- 定義index屬性滔迈,指向本身
BaseClass.__index = BaseClass;
-- 定義構(gòu)造函數(shù)
function BaseClass:new(a)
-- 定義私有表止吁,屬性存儲(chǔ)在子表obj中
local obj = {["a"] = a};
-- 設(shè)置obj表的原表為self被辑,即BaseClass
-- 此時(shí)查找obj的屬性就會(huì)自動(dòng)去查找BaseClass,同時(shí)查找Baseclass又會(huì)自己找自己
setmetatable(obj, self);
return obj;
end
-- 定義成員方法
function BaseClass:PrintInfo()
print("表是"..tostring(self).."打印信息"..self.a);
end
local classObj = BaseClass:new(10);
print("新對(duì)象是"..tostring(classObj));
-- classObj沒(méi)有printInfo方法敬惦,而是通過(guò)元表盼理,得到的BaseClass的PrintInfo方法俄删,打印中
--傳遞過(guò)去的self其實(shí)是classObj自身
classObj:PrintInfo();
-- 子類宏怔,繼承
local childClass = {};
--設(shè)置子類元表,子類沒(méi)有就去父類尋找
setmetatable(childClass, BaseClass);
--設(shè)置index屬性畴椰,指向自身
childClass.__index = childClass;
-- 子類構(gòu)造函數(shù)
function childClass:new(a,b)
-- 和BaseClass一樣的方式
-- 不同之處在于子表要“繼承”父類
local obj = BaseClass:new(a);
-- 添加自身特有屬性
obj.b = b;
setmetatable(obj,self);
return obj;
end
--子類的方法
function childClass:PrintChildInfo()
print("子類的方法"..self.b);
end
-- 多態(tài)
-- 重寫父類方法
function childClass:PrintInfo()
--這里的self是子類中的子表
print("多態(tài)"..self.a);
end
local childObj = childClass:new(50, 5);
childObj:PrintChildInfo();
--調(diào)用childObj沒(méi)有的方法臊诊,查找元表BaseClass
childObj:PrintInfo();
打印的結(jié)果是:
子類的方法5
多態(tài)50