美文网首页程序员
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的学习还要加油!!

    相关文章

      网友评论

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

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