|
原理
1. lua的面向对象是基于元表metatable实现的,原理即在一个表中查找不到,就到元表中查找
2. lua的多继承原理即在一个表中查找不到,则到多个表中进行查询
----------------------------------------- 基类BaseClass1 ------------------------------------------
-- 类BaseClass1的声明
BaseClass1 =
{
}-- 构造函数
function BaseClass1:new()
print("BaseClass1:构造函数")
-- 新建一个对象,这样通过BaseClass1:new()函数创建的每一个实例都是独立的
local tempObj = {}
-- 设置新对象的metatable,谨记:这一步非常重要
setmetatable(tempObj,{__index = BaseClass1})
-- 返回这个新创建的对象
return tempObj
end
-- 类的print()函数
function BaseClass1: Print()
print("BaseClass1: Print()")
end
-- 类的特有函数Add()
function BaseClass1: Add()
print("BaseClass1: Add()")
end
----------------------------------------- 基类BaseClass2 ------------------------------------------
-- 类BaseClass2的声明
BaseClass2 =
{
}
-- 构造函数
function BaseClass2:new()
print("BaseClass2:构造函数")
-- 新建一个对象,这样通过BaseClass2:new()函数创建的每一个实例都是独立的
local tempObj = {}
-- 设置新对象的metatable,谨记:这一步非常重要
setmetatable(tempObj,{__index = BaseClass2})
-- 返回这个新创建的对象
return tempObj
end
-- 类的print()函数
function BaseClass2: Print()
print("BaseClass2: Print()")
end
-- 类的特有函数Reduce()
function BaseClass2: Reduce()
print("BaseClass2:Reduce()")
end
----------------------------------------- 搜索函数 ---------------------------------------
-- 非常关键的函数(在table list中查找变量key)
local function search(key,list)
for i=1, table.getn(list) do
local v = list[key]
if v then
return v
end
end
end
----------------------------------------- 子类SubClass ----------------------------------------
local SubClass =
{
}
function SubClass:new()
-- 为SubClass设置元表
local base = {BaseClass1, BaseClass2}
setmetatable(SubClass, {__index= function(table,key) return search(key, base) end})
-- 新建一个子类对象,设置元表为SubClass
local tempObj = {}
setmetatable(tempObj, {__index = SubClass})
return tempObj
end
-- 子类的特有函数
function SubClass:SubPrint()
print("SubClass:SubPrint()")
end
---------------------------------------- 下面是测试代码 -----------------------------------
-- 构造一个子类实例
local SubObj = SubClass:new()
-- 访问子类自己的print()函数,
--由于基类1和基类2里面都有Print()函数,会发现,实际访问的是基类1里面的函数,非常不建议基类中函数/变量名字一样,容易混淆
SubObj: Print()
-- 访问子类自己的SubPrint()函数
SubObj:SubPrint()
-- 访问基类1的特有函数Add()
SubObj:Add()
-- 访问基类2的特有函数Reduce()
SubObj:Reduce()
代码2:
- http://my.oschina.net/u/156466/blog/401576
- local class1 = {}
- function class1:new()
- local obj = {}
- setmetatable(obj, {__index= class1})
- return obj
- end
- function class1:print1()
- print("class1:print()")
- end
- function class1:print2()
- print("class1:print()")
- end
- local class2 = {}
- function class2:new()
- local obj = {}
- setmetatable(obj, {__index= class2})
- return obj
- end
- function class2:print2()
- print("class2:print()")
- end
- local class3 = {}
- function class3:new()
- local obj = {}
- setmetatable(obj, {__index= class3})
- return obj
- end
- function class3:print2()
- print("class3:print()")
- end
- function class3:print3()
- print("class3:print()")
- end
- function super(k, list)
- for i,v in ipairs(list) do
- local ret = v[k]
- if ret then
- return ret
- end
- end
- end
- local class = {}
- function class:new(...)
- local obj = {}
- -- local base = {class1, class2}
- local base = {...};
- --t为调用的对象,k为方法名
- setmetatable(class, {__index= function(t,k) return super(k, base) end})
- setmetatable(obj, {__index = class})
- return obj
- end
- local c = class:new(class2,class1,class3);
- -- c:print1();
- c:print2();
- -- c:print3();
复制代码
|
|