美文网首页程序员
lua面向对象实现的(记)

lua面向对象实现的(记)

作者: AngerCow | 来源:发表于2017-11-16 10:06 被阅读0次

Lua中实现面向对象用的是元表的机制,元表与表是不同的个体,创建table时,不会自动创建元表。不过任何的表都可以有元表。
setmetatable(table1,table2):table2会做为table1的元表,同时有一个返回值table1.
__index方法,这个是元表中的元方法,它有回溯的功能,可以查找table中的属性,找不到相关属性会返回nil.找到就会返回相应的值。
__index的值可以是一个方法,也可以是一个表,表又可能具有表有的特性。
写下实现面向对象的思路:
首先是类的特点,继承。
我们可以先定义一个父类Parent
Parent = {
x = 10,
y = 20
}
function Parent( t )
{
local t = t or {}
self.__index = self
setmetatable( t, self )
return tend

}
Parent有两个属性,new方法是实例出一个对象,这个对象同时也是个类,为什么呢?我们分析一下:
1.把元方法指向自己
self.__index = self
2.设置元表也是自身
setmetatable( t, self )
3.最后返回这个对象
return t
我们可以先试验证一下
Child = Parent:new()
print(Child.x)
--10
我们得到一个对象Child,Child访问变量x,在自身找不到变量,Child就会去元表里查找有没有值,找到就会去找元方法的引用,此时到达Parent,Parent里有x,就返回x的值,但是Child里是没有x,系统就会构造一个变量来接收Parent的x,这样Child自身虽然没有x这个变量,但是他还是能通过元表与元方法得到Parent的x值,这不正是继承了吗?
同时,Child也是一个类,因为在new的时候,Child也返回了一个指向身的原型,所以Child也有Parent的功能,所以我们可以这样访问:
Child2 = Child2.new()
print(Child2.x)
--10
这样我们就能实现一条长长的继承链
我们还可以在子类覆盖父类的方法与成员变量,也就是重载,这个其实很简单了,我们已经实现继承就好办了直接上代码:
Child2 = Child2.new()
self.x = 20
print(Child2.x)
--20
直接更改赋值就行。
Lua的灵活与强大难以致信,对Lua的学习还要加油!!

相关文章

  • 大话C与Lua(五) 面向对象的数据结构——userdata

    如何实现面向对象? 熟悉Lua的同学都知道!在Lua内部已经实现了面向对象的基本机制(table), 同时也为宿主...

  • lua面向对象实现的(记)

    Lua中实现面向对象用的是元表的机制,元表与表是不同的个体,创建table时,不会自动创建元表。不过任何的表都可以...

  • Lua面向对象实现

    这个类主要是把基类和派生类绑定起来,并且调用ctor构造函数用法如下 注意调用父类的方法要用"."别用":"是因为...

  • Lua实现面向对象

    注:只是仿照,并不是真正的面向对象C#中是用this表示当前类的对象,Lua中使用self点(.)与冒号(:)的区...

  • 2018-08-02

    lua实现继承,重载和多态(上) *讲到lua的继承等面向对象的实现,首先得讲一下lua中的几个元方法和元表. s...

  • lua实现多继承

    lua对于面向对象的支持主要通过table来实现,每个table都是一个对象,对于继承,lua有元表的机制,通过s...

  • Lua 实现面向对象 (原创)

    要理解Lua是如何实现面向对象的。首先要熟悉Lua元表的相关知识,可以阅读我上一篇文章《Lua元表 (Metata...

  • Lua实现面向对象机制

    开篇废话 最近重拾了Lua,因为新项目在用。大概4-5年前准备进入从事游戏行的时候,看到某司的招聘简章中提到了Lu...

  • lua实现class(面向对象)

    用惯了python,觉得python真的好写。相比起来lua简直是一坨屎。拿lua开发的话,面向对象还是必不可少的...

  • 对lua中类、实例、继承的理解

    lua底层有__index等表,去实现类,实例、继承。但是比较绕。 参考1.1.5.Lua语言面向对象之复制表的方...

网友评论

    本文标题:lua面向对象实现的(记)

    本文链接:https://www.haomeiwen.com/subject/jszkvxtx.html