Lua是一门非常容易上手的脚本语言
超EASY的哦!
特点:
轻量
开发效率高
可嵌入在C/C++,Java, Ruby等语言当中,是很好用的”胶水语言”
Lua提供面向过程式编程, 同时可以模拟面向对象(O-O)
0.问题描述
总所周知,面向对象(O-O)语言的三大特性:封装, 继承与多态
接下来,俺就使用Lua来模拟面向对象(O-O), 体现这三个特性
1.Lua模拟类(Class)
O-O语言里一个重要的概念就是类(class)
然而,Lua里面没有类的概念
好在
Lua是一门可以定制和拓展的语言
将Lua改造成伪O-O是MU有问题滴!
这里要用到Lua里面很屌的一个类型: table
这玩意儿不错,里边可以放变量,放函数,放table,…
-- table, 用于模拟类Beauty
Beauty = {}
-- 变量
Beauty.name = ""
-- 函数
Beauty.setName = function (name)
Beauty.name = name
end
Beauty.getName = function ()
return Beauty.name
end
-- 构造函数
function Beauty.new()
tmp = {}
for k,v in pairs(Beauty) do
tmp[k] = v
print(k, v) -- 这里的打印结果可以帮你看到函数做了什么事情
end
return tmp
end
-- 创建一个类的实例
kato = Beauty.new()
-- 调用类函数
kato.setName("Kato")
print(kato.getName()) -- 打印结果: Kato
语法效果是真的清秀
2.模拟继承(Inherit)
继承, 描述的是”is-a”关系,Lua是怎样实现的呢?
我们知道,继承有接口继承和实现继承之分
Lua在继承时使用的是metatable中的__index
metatable是什么?传送门
在Lua里, 有了metatable的概念,实现继承是很容易的
然而
我这里的例子并没有用metatable
-- table, 用于基类Beauty
Beauty = {}
-- 基类变量
Beauty.name = ""
-- 基类函数
Beauty.setName = function (name)
Beauty.name = name
end
Beauty.getName = function ()
return Beauty.name
end
-- 基类构造函数
function Beauty.new()
tmp = {}
for k,v in pairs(Beauty) do
tmp[k] = v
print(k, v)
end
return tmp
end
-------------------------------------
-------------------------------------
-- table, 用于继承类Kato
Kato = {}
------------------
-- 继承在这里! ---
-- 继承Beauty类
Kato = Beauty.new()
-- 继承类自己的变量
Kato.personalEnjoy = "nothing"
-- 继承类自己的函数
Kato.personalDesc = function ()
print("hello, I'm kato")
end
-- 继承类的new方法
Kato.new = function ()
tmp = {}
for k, v in pairs(Kato) do
tmp[k] = v
end
return tmp
end
-- 创建一个类的实例
kato = Kato.new()
-- 调用父类函数
kato.setName("Kato")
print(kato.getName()) -- 打印结果: Kato
kato.personalDesc() -- 打印结果: hello, I'm kato
当然,细心的童鞋会发现
我这里实现是有潜在问题的
什么问题呢?
提示: deep copy
3.模拟多态(Polymorphism)
Lua语言动态类型的特性
指针多态
很容易的啦
根据第二个部分,我们再加几行
-- 标注 ... 的代码与第2部分模拟继承一模一样
...
-- 添加的几行
kato = Beauty.new()
kato.setName("beauty")
print(kato.getName()) -- 打印结果: beauty
kato = Kato.new()
kato.setName("megumi")
print(Kato.getName()) -- 打印结果: megumi
4.小结(Conclude)
Lua是不错的胶水语言
metatable很不错哦(我正在学习中), 有机会一定去尝试下
好玩 !
谢谢观阅, 下次再见 !