• [转]Lua中的面向对象实现方法


    面向对象不是针对某一门语言,而是一种思想,在面向过程的语言也可以使用面向对象的思想来进行编程。在Lua中,并没有面向对象的概念存在,没有类的定义和子类的定义,但同样在Lua中可以利用面向对象的思想来实现面向对象的类继承。

    一、复制表的方式面向对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    --Lua中的面向对象
    --[[
      复制表方式面向对象
      参数为一张表,通过遍历这张表取值,赋给一张空表,最后返回新建的表,来达到克隆表
    ]]
    function clone(tab)
        local ins = {}
        for key, var in pairs(tab) do
            ins[key] = var
        end
        return ins
    end
     
    --[[
      复制表
      第一参数是目标表,第二个参数是需要复制的表
      通过遍历tab来取值将它赋值到目标表中
    ]]
    function copy(dist,tab)
        for key, var in pairs(tab) do
            dist[key] = var
        end
    end
     
    -- 定义一张空表,相当于一个类
    People ={}
     
    --function People.sayHi()
    --  print("People say hi")
    --end
     
    -- 定义类中的方法sayHi,传入一个self参数
    People.sayHi = function (self)
        print("People say hi:"..self.name)
    end
     
    -- 定义一个new方法,传进一个name参数,通过克隆People这张表来生成一个对象
    -- 相当于类当中的一个构造方法
    People.new = function (name)
        local self = clone(People)
        self.name = name
         
        return self
    end
     
    --local p = clone(People)
    --p.sayHi()
    --生成一个新的对象
    local p = People.new("ZhangSan")
    --p.sayHi(p)
    --p:sayHi()
     
     
    --定义一张空表,也代表一个类
    Man = {}
    --Man中的构造方法,实现Lua中类的继承
    Man.new = function (name)
        local self = People.new(name)
        --附加Man中所有的键值对到People中的实例中去
        copy(self,Man)
        return self
    end
     
    Man.sayHello = function ()
        print("Man say hello")
    end
     
    --重写父类People中的sayHi方法
    Man.sayHi = function (self)
        print("Man sayHi "..self.name)
    end
     
    --创建Man的一个实例
    local m = Man.new("Lisi")
    m:sayHi()

    以上代码已经有详细的注释,读者需要仔细阅读这里所给出的例子。

    二、使用函数闭包的形式实现面向对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    --以函数闭包的形式实现面向对象
     
    --定义一个方法,函数闭包实现一个类的概念
    function People(name)
        local self = {}
      --初始化方法,私有的
        local function init()
            self.name = name
        end
       
        self.sayHi = function ()
            print("Hello "..self.name)
        end
     
      --调用初始化
        init()
        return self
    end
     
    --实例化一个对象
    local p = People("ZhangSan")
    p:sayHi()
     
    --函数闭包的形式实现类继承
    function Man(name)
        local self = People(name)
         
    --  local function init()
    --     
    --  end
     
        self.sayHello = function ()
            print("Hi "..self.name)
        end
         
        return self
    end
     
     
    local m = Man("Lisi")
    --m:sayHello()
    m:sayHi()

    以上两种方式均可实现面向对象,目测第二种方法更为简洁一些,具体使用按照个人的喜好来做。

    原文链接:http://cn.cocos2d-x.org/tutorial/show?id=1133

  • 相关阅读:
    python拆分pubchem SDF文件
    zlib压缩爬虫采集到的网页源码保存到mongodb减少存储空间
    openresty (lua-nginx_static_merger)合并css js文件 减少请求次数,提升页面速度
    scrapy采集—爬取中文乱码,gb2312转为utf-8
    不写代码的爬虫
    爬虫如何发现更多的url呢,怎么动态收集新的url连接
    python 将GIF拆分成图片方法
    Linux shell循环遍历
    iOS 11 导航栏放置UISearchBar 导航栏高度变高解决办法 (iPhone X出现的情况)
    隐藏UISearchBar中的删除按钮
  • 原文地址:https://www.cnblogs.com/laihaiteng/p/3865471.html
Copyright © 2020-2023  润新知