Lua学习记录-3
程序员文章站
2022-03-14 11:01:01
...
Lua 学习记录-3
实现继承(元表)
-
Lua中实现模拟对象的原理是利用table,如果要实现继承或者多继承,那么就得仰仗table的特性-元方法
-
元方法中用的比较多的是__index 元方法,当你通过键来访问 table 的时候,如果这个键没有值,那么Lua
-
继承的实现原理是setmetatable() + __index元表,
mytable = {} -- 普通表 mymetatable = {} -- 元表 setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
继承与多继承就是让__index能遍历多个表找出正确表对应的元素。(可以将通用的代码设置到Live Templates中)
local function super(key, list)
for i, v in ipairs(list) do
local table = list[i];
local var = table[key]
if var then
return var;
end
end
return nil;
end
--Base Class
local Father = {};
Father.grandFather = "Unknown";
Father.grandAge = 0;
Father.address = "Unknown";
function Father:setFatherMessage(m_father, m_age, m_address)
self.grandFather = m_father;
self.grandAge = m_age;
self.address = m_address;
end
function Father:getFatherMessage()
print("姓名 : " .. self.grandFather, "年龄 : " .. self.grandAge)
end
function Father.jump()
print("Father跳起来了")
end
--Sub class
local GrandSon = {};
GrandSon.say = "I have a dream"
--当__index指向的是函数时,
function createGrandSon()
local grandson_obj = {};
local baseClass = { GrandSon, Father }; --要继承的类
setmetatable(grandson_obj, {
__index = function(t, k) --function(t,k)为lua解释器机制,k为属性名或方法名
return super(k, baseClass); --默认有两个参数,第一个为table,第二个为要查找的key
end
});
return grandson_obj;
end
local a = createGrandSon()
a.jump()
a:getFatherMessage()
print(a.say)
上一篇: 在 Lua 中实现类似于 Swift Extension 的机制
下一篇: 各类排序总结
推荐阅读
-
Python Logging 日志记录入门学习
-
java学习之路_篇超好的文章第1/3页
-
学习WEB标准总结的一些CSS/XHTML知识小结第1/3页
-
python3爬虫学习之数据存储txt的案例详解
-
Linux计划任务Crontab学习笔记(3):配置文件
-
Django开发学习BUG记录--RemovedInDjango19Warning:Model class apps.user.models.User doesn't declare an explicit app_label
-
CSS3中的Media Queries学习笔记
-
laravel框架学习记录之表单操作详解
-
Python3 多进程编程 - 学习笔记
-
PHP getID3类的使用方法学习笔记【附getID3源码下载】