通过抄袭lua程序设计中的多重继承代码,发现了好多坑,主要是lua 5.2版本比之前有了很多改动
下面是适应5.2版的多重继承部分代码
※ 关于lua中类与对象的问题:类与对象本质都是table,那么遇到一个“table”,如何区分开它是类还是对象,从而避免对类的操作,达到让类不能使用成员函数,只能实例化对象的目的?
1. 取代table.getn
function getn( t )
-- body
-- print("getn");
-- print(t);
local x =0;
for k, v in pairs(t) do
x = x+1;
-- print(v);
end
return x;
end
2.search部分基本不变,将table.getn改为自定义的getn
local function search(k,plist )
local v ;
for i=1 , getn(plist) do
v = plist[i][k]
if v then
return v
end
end
end
3. creatClass部分修改了arg的获取方式
function createClass(... )
arg ={...}--新版本修改
local c={}
setmetatable( c, {__index = function (t,k)
return search( k , arg )
end })
c.__index = c;
function c:new( o )
o = o or {}
setmetatable( o ,c);
o.class=c.name;
return o;
end
return c;
end
4.测试代码
shitClass1 ={};
function shitClass1.showShit()
print("shit class show me");
end
dogShitClass1={};
function dogShitClass1.showDogShit( ... )
-- body
print("dog shit class show me");
end
getn(shitClass1);
shitClassSon = createClass(shitClass1 ,dogShitClass1);--多重继承
function shitClassSon.showMeName ()--派生类函数
print("son of the Shit ")
end
s = shitClassSon:new();--生对象
print("==============start=============");
s.showMeName();
s.showShit();
s.showDogShit();
print("==============end=============");
5.打印
==============start=============
son of the Shit
shit class show me
dog shit class show me
==============end=============
enjoy :)