• [Lua快速了解一下]Lua的OOP


    __index(a, b)                   对应表达式 a.b

    上面我们看到有__index这个重载,这个东西主要是重载了find key的操作。这波操作可以让Lua变得有点面向对象的感觉,让其有点像Javascript的prototype。

    所谓__index,说得明确一点,如果我们有两个对象a和b,我们想让b作为a的prototype只需要

    setmetatable(a, {__index = b})

    例如下面的示例:你可以用一个Window_Prototype的模板加上__index的MetaMethod来创建另一个实例:

    Window_Prototype = {x=0, y=0, width=100, height=100}
    MyWin = {title="Hello"}
    setmetatable(MyWin, {__index = Window_Prototype})

    于是:MyWin中就可以访问x, y, width, height的东东了。(注:当表要索引一个值时如table[key], Lua会首先在table本身中查找key的值, 如果没有并且这个table存在一个带有__index属性的Metatable, 则Lua会按照__index所定义的函数逻辑查找)

    有了以上的基础,我们可以来说说所谓的Lua的面向对象

    Person={}
     
    function Person:new(p)
        local obj = p
        if (obj == nil) then
            obj = {name="ChenHao", age=37, handsome=true}
        end
        self.__index = self
        return setmetatable(obj, self)
    end
     
    function Person:toString()
        return self.name .." : ".. self.age .." : ".. (self.handsome and "handsome" or "ugly")
    end

    上面我们可以看到有一个new方法和一个toString的方法。其中:

    1)self 就是 Person,Person:new(p),相当于Person.new(self, p)
    2)new方法的self.__index = self 的意图是怕self被扩展后改写,所以,让其保持原样
    3)setmetatable这个函数返回的是第一个参数的值。

    于是:我们可以这样调用:

    me = Person:new()
    print(me:toString())
     
    kf = Person:new{name="King's fucking", age=70, handsome=false}
    print(kf:toString())

    继承如下,我就不多说了,Lua和Javascript很相似,都是在Prototype的实例上改过来改过去的。

    Student = Person:new()
     
    function Student:new()
        newObj = {year = 2013}
        self.__index = self
        return setmetatable(newObj, self)
    end
     
    function Student:toString()
        return "Student : ".. self.year.." : " .. self.name
    end
  • 相关阅读:
    漫谈 C++ 的 内存堆 实现原理
    我发起了一个 .Net 开源 数据库 项目 SqlNet
    谈谈 数据库原理
    论 数据库 B Tree 索引 在 固态硬盘 上 的 离散存储
    论 东坡肉 和 红烧肉 的 区别
    浅谈 操作系统原理
    引子 初识
    P2P Downloader
    利用 MessageRPC 和 ShareMemory 来实现 分布式并行计算
    MessageRPC
  • 原文地址:https://www.cnblogs.com/otakuhan/p/8606790.html
Copyright © 2020-2023  润新知