`
445822357
  • 浏览: 741525 次
文章分类
社区版块
存档分类
最新评论

Lua 面向对象编程 类的封装与继承

 
阅读更多

勤奋努力,持之以恒!


Lua中的数据结构,可以存放各种域。

由于Lua中的函数也是第一类值,于是表可以存放属性域和方法域,因此表可以描述一个类。

元表

元表也是一个表,可以设置给一个本表。

一个表作为元表概念存在的意义在于它可以通过定义自身的一系列元方法来改变本表的行为。

如果一个元表不被设置给一个本表,那么他是没有意义的,一个本表的元表可以是自身。

元方法

Lua给表预备了一些特殊的行为,这些行为可以通过元方法来定义。


--表,元表,元方法的功能组合起来,可以让lua代码实现面向对象的机制。
------------------------- 通过 表table 元表metatable 元方法metamethod 封装一个类------------------------------

Base = {} --Base是原型表.一个原型表用来描述一个类,在原型表中填写类方法,类属性则声明在构造函数内的新表中。

--实例化对象时,创建一个新表,将新表的元表设置为原型表。
--self表示自身,lua本身没有面向对象概念,实现面向对象使用的是table类型,当函数内操作self时相当于使用对象本身。
function Base.new(self) 
    --创建一个新表o,类中的成员最好声明在构造函数内的新表中,而方法可以声明在原型表中。
    local o = {x = 0, y = 0, t = {h = 0}} 
    --将新表o的元表设置为原型表。 
    setmetatable(o,self)  
    
    --[[__index元方法:当访问到表中不存在的域时,将调用其元表的__index元方法(如果该表指定了元表并且元表定义了__index元方法的话)。
    如果其元表的__index方法返回一个表中含有该域,则访问该域。]]--
    self.__index = self --原型表的__index为原型表。
    return o
end


function Base.setXY(self, x, y)--元方法
    self.x = x
    self.y = y
end

----------------------------------------------------------------------------------------------------------


------------------------------------------  创建一个新类Deriver,使它继承Base类---------------------------------

--派生一个类只需要一个原型表的新实例
Deriver = Base:new()

--Deriver表现在看起来是一个Base原型表的新实例,它的元表是Base,重写Deriver的new方法,在new方法中扩充Deriver的新属性。
function Deriver.new(self)
    local o = getmetatable(self).new(self)
    o.z = 0 --添加一新属性
    return o
end

-----------------------------------------------------------------------------------------------------------

local function myInit()
    --封装的类实例化
    local b1 = Base:new()
    --b1:setXY(200,300)
    b1.x = 200
    b1.y = 300
    b1.t.h = 100
    cclog("b1X = %d, b1Y = %d, b1T = %d",b1.x,b1.y,b1.t.h)
    --[LUA-print] b1X = 200, b1Y = 300, b1T = 100

    local b2 = Base:new()
    b2:setXY(300,400)
    b2.t.h = 99
    cclog("b2X = %d, b2Y = %d, b2T = %d",b2.x,b2.y,b2.t.h)
    --[LUA-print] b2X = 300, b2Y = 400, b2T = 99
    
    
    --继承类实例化
    local d = Deriver:new()
    d:setXY(500,600)
    d.z = 101
    d.t.h = 102
    cclog("dX = %d, dY = %d, dT = %d, dZ = %d",d.x,d.y,d.t.h,d.z)
    --[LUA-print] dX = 500, dY = 600, dT = 102, dZ = 101
end



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics