Lua里实现简单的类-对象

2012-08-02 18:18

Lua里实现简单的类-对象

by Kevin Lynx

at 2012-08-02 10:18:00

original http://www.udpwork.com/item/7856.html

要在Lua里实现面向对象有很多方法,为了支持面向对象的一些特性(类、对象、继承、重载等),其实现可能会比较复杂。看看云风的这篇,以及后面的评论,有总结的不错的。这真是让人对Lua刮目相看。但是我并不需要这些机制,一般情况下我只需要支持类即可。

类其实就是定义一个对象的函数模板,避免我写出带模块名并且第一个参数是操作对象的函数(像C一样)。以下代码提炼于rapanui(基于moai的高层封装),摘抄于几个月前我基于rapanui移植到android上的一个小游戏

local function newindex(self, key, value)
    getmetatable(self).__object[key] = value
end

local function index(self, key)
    return getmetatable(self).__object[key]
end

function newObject(o, class)
    class.__index = class
    setmetatable(o, class)
    return setmetatable({}, { __newindex = newindex, __index = index, __object = o })
end

基于newObject函数,可以这样定义类:

Button = {}

function Button.new(text, x, y, onclick, parent)
    -- 定义这个类的数据成员
    local obj = {
        text = text,
        onclick = onclick,
        normal_img = nil,
        text_inst = nil,
        hover_img = nil,
    }
    obj = newObject(obj, Button)
    ...
    return obj
end

function Button:onTouchDown(x, y)
    ...
    -- 可以访问成员,即使看起来normal_img不属于Button这个table
    self.normal_img.visible = true
end

function Button:onTouchUp(x, y)
    ...
end

通过以上定义后,就可以以面向对象的方式来使用Button类了:

local btn = Button.new()
btn:OnTouchDown(100, 100)
btn:OnTouchUp(100, 100)

其实现原理,主要就是将类的函数集通过__index开放给对象,在这些函数中,其self就像c++ 中的this一样拥有多态性,即其是创建出来的对象,而不是作为类角色的那个table(例如Button)。

原文地址:http://codemacro.com/2012/08/02/simple-oo-in-lua/
written byKevin Lynx posted athttp://codemacro.com

        <div style="margin-top:8px;padding:6px 0;border-top:1px solid #3cf">
            <div style="text-align:center;margin:16px 0;padding:6px;border:0px dashed #999;font-family:arial;font-size:26px;font-weight:bold">
<a href="http://www.udpwork.com/item/7856.html#review_form" title="不喜欢" style="text-decoration:none">
    <img src="http://www.udpwork.com//images/thumb_down24.gif" alt="">
    <span style="color:#f33">0</span>
</a>
   
<a href="http://www.udpwork.com/item/7856.html#review_form" title="喜欢" style="text-decoration:none">
    <img src="http://www.udpwork.com//images/thumb_up24.gif" alt="">
    <span style="color:#3c3">0</span>
</a>

IT 牛人博客聚合网站(udpwork.com) 聚合 | 评论: 0 | 10000+ 本编程/Linux PDF/CHM 电子书下载