天天看点

Lua下通过元表模拟OOP编程,继承多态

Lua本身是没有以明确的定义来支持OOP编程的,但是我们却可以通过Lua内核提供的一些特性来间接实现简单的面向对象的编程。 

通过Lua中的 table结构  metatable 以及函数可以配合实现OOP,以及继承。这些说白了都是一种伪实现,不建议在Lua下使用多重继承 。

在LUA中你想要 强制实现OOP 你必须需要懂一下几个关键词!!

什么是语法糖?

比如char str[100] ;我访问第一个 字符 我是不是可以这样    str[1]   *(str+1) 简化了 代码编写 使粘合度 更高 就是一种语法糖。用过c#的人可以发现,C#的语法糖做到了极致。

什么是table?

Lua中的结构只有table,他是基于 HashMap  与索引数组与 一身,能存放任意类型数据,包括函数 何以其他表  这也就是  我们模拟集成的奠定了基础。

什么是metable?

local tb={["a"=1]}  这么一段代码 ,假如 我print(tb.b) 那么会提示找不到b, 

这个时候叫做元表的metable 就起作用了,这会触发lua的 搜索机制,就去从metatable 中 搜索 b  这一点是不是和 javascript 的  prototype 类型呢?

这也就是我们实现继承的基础

 table中的__index是做什么用的?

他是一个函数,这个函数告诉Lua解释器  当在一个table中找不到  相对应元素的时候 如何从 metable 中搜索元素。

实现OOP

结果如下

Lua下通过元表模拟OOP编程,继承多态

LUA模拟实现继承

Lua下通过元表模拟OOP编程,继承多态

模拟实现多态

既然继承我们都实现了 多态我们只需要在不同的类型中添加不同的定语法糖函数义即可

Lua下通过元表模拟OOP编程,继承多态

参考资料 

http://blog.csdn.net/ym012/article/details/7206968

http://www.xuebuyuan.com/1613223.html

http://blog.csdn.net/xocoder/article/details/9028347

http://www.cnblogs.com/zhiranok/archive/2012/02/07/lua_object_skill.html