Lua 对象

0.lua的类

(1)lua的类实际上就是lua的 table ,类之间的继承实际上就是吧 table 连到一起了,调用方法和属性,

    就是先去第一个table搜索如果没有再去连在后面的table里搜索。

(2)lua里的self实际上就是table了,也能代表类名

(3)lua继承

local self = {}

setmetatable(self , classA)                     -- self 继承 classA

setmetatable(classB , classA)                 -- classB 继承 classA

(4)表唯一的标示

classA.__index = classA          ------classA.table的访问表 是 它本身


1.类的属性

(1) classA = {x = 0, y = 0}

(2) classA = {}

      classA._x = 0
      classA._y = 0

两种声明属性都行,之后在方法里可以通过,self.x 调用


2.类的方法

function  classA:new()    

    隐藏传递 self ,默认第一个参数,可以通过 self.xxx 调用属性和方法

end

function  classA.new()     

    必须要传递 类名(self), 否则不能调用 self

end

声明和调用方法都用 :、属性的调用全部用点号 .


3.创建类

    classA = {} 

function  classA:new(o)                          
  o=  o or {}                                      实现了一个类有多个对象,创建一个对象跟谁着创建了一个元表 self ,                                                           

        setmetatable(o, self )       

self .__index = self 

    return o
end


4.使用类

classA = {x = 0, y = 0}                              --{}可以声明属性 

classA.__index = classA
function  classA:new(o)                            --function 前面不能加 local,前面已经通过 classA限定范围了
      = o or {}                                    --创建新的表作为实例的对象
      setmetatable(o , self)              -- 设置class为对象元表的__index

      self.__index = self
      return o                                       --返回该新表
end

function classA:func()
     print("classA : func")
end

function classA:createA(tag)                       
      print("classA : create   "..tag)
end


local sa = classA:new({})                              --实例化对象sa
sa:createA(122)
classA:createA(3)


5.类的继承

classB = {}
classB.__index = classB

function  classB:new()                            
       setmetatable(classB , classA)                  --父类放在后面。实际上就是把 classB 和 classA 连到一起先搜 classB 表有没有这个方法,                                                                       --没有会向后搜索 classA 再没有会继续向后搜索,如果没有会返回 nil
      return classB                                   
end

function classB:createB(tag)                       
     print("classA : create   "..tag)
end


local sb = classB:new()
sb:createA(102) 


6.2dx的lua继承

(1)class 是 cocos2d-x 的方法 path: ../cocos2d-x-3.1/cocos/scripting/lua-bindings/script/extern.lua
    class("A", B) A 继承 B,B必须是lua文件里的类
(2)setmetatable(A, B) 是 lua 的继承, A 继承 B
(3)通过 tolua 的继承 tolua.getpeer(target) target:cc.Sprite:create(img) 是C++的一个对象
    再通过 setmetatable(t, ChilSprite) 实现对 C++对象的继承

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. local ParentOne = class("ParentOne")               
  2.   
  3. function ParentOne:testDemo()  
  4.     print('ParentOne           demo')  
  5. end  
  6.   
  7.   
  8. --父类 ParentOne  
  9. local ChilSprite = class("ChilSprite", ParentOne)  
  10. ChilSprite.__index = ChilSprite  
  11.   
  12. function ChilSprite.extend(target)  
  13.     local t = tolua.getpeer(target)                                 --tolua的继承  
  14.     if not t then  
  15.         t = {}  
  16.         tolua.setpeer(target, t)  
  17.     end  
  18.     setmetatable(t, ChilSprite)  
  19.     return target  
  20. end  
  21.   
  22. function ChilSprite:createS(img)  
  23.     local sprite = ChilSprite.extend(cc.Sprite:create(img))  
  24.     return sprite  
  25. end  
  26.   
  27. function ChilSprite:myFunc(img)  
  28.     print("ChilSprite  myFunc   "..img)  
  29. end  
  30.   
  31. function ChilSprite:goFunc()  
  32.     print("ChilSprite  goFunc   ")  
  33. end  
  34.   
  35.   
  36. --父类 ChilSprite  
  37. local ChilLayer = class("ChilLayer", ChilSprite)  
  38. ChilLayer.__index = ChilLayer  
  39.   
  40. function ChilLayer.extend(target)  
  41.     local t = tolua.getpeer(target)  
  42.     if not t then  
  43.         t = {}  
  44.         tolua.setpeer(target, t)  
  45.     end  
  46.     setmetatable(t, ChilLayer)  
  47.     return target  
  48. end  
  49.   
  50. function ChilLayer:createL(img)  
  51.     local sprite = ChilLayer.extend(cc.Sprite:create(img))  
  52.     return sprite  
  53. end  
  54.   
  55. function ChilLayer:myFunc(img)  
  56.     print("ChilLayer  myFunc   "..img)  
  57. end  
  58.   
  59.   
  60. local function testBccLayer( scene )  
  61.     local ball = ChilLayer:createL("Images/ball.png")  
  62.     ball:setPosition(cc.p(VisibleRect:center().x - 110, VisibleRect:center().y - 110))  
  63.     ball:setScale(3)  
  64.     scene:addChild(ball, 1111)  
  65.   
  66.     local cball = ChilLayer:createS("Images/ball.png")       --调用父类的方法  
  67.     cball:setPosition(cc.p(VisibleRect:center().x + 110, VisibleRect:center().y + 110))  
  68.     cball:setScale(3)  
  69.     scene:addChild(cball, 1111)  
  70.   
  71.     ball:myFunc("1235")                                      --调用自己的方法,覆盖父类的方法  
  72.     ball:goFunc()                                            --调用父类的方法  
  73.     ball:testDemo()                                          --调用父类的父类方法  
  74. end  
  75.   
  76.   
  77. function testBcc(scene)  
  78.     testBccLayer(scene)  
  79. end  


7.通过 class 继承 c++对象

具体可以看 extern.lua 里对继承 lua object 和 c++ object 进行了判断

testCcc = {};
testCcc = class("testCcc",function(img)
return cc.Sprite:create(img)
testCcc.__index = testCcc;

//构造函数 可以进行一些初始化操作
function testCcc:ctor(img)

。。。。

end


使用如下两个函数 来调用构造函数ctor  详情请看 function.lua(或者extern.lua)文件中的class模板
local ccc = testCcc.new("Images/ball.png");

或者

local ccc = testCcc.create("Images/ball.png");







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lua是一种脚本语言,它支持面向对象编程。在Lua中,我们可以通过表(table)来实现面向对象编程。表可以被看作是一个对象,它可以存储任意类型的数据(包括函数),还可以作为其他表的元素。下面是使用Lua实现面向对象的一些基本步骤: 1. 创建一个表,它代表一个类 2. 在这个表中定义一个构造函数,用于创建该类的实例 3. 在这个表中定义其他成员函数和成员变量 4. 在这个表中定义一个元表,用于实现继承和多态 下面是一个简单的例子,展示了如何使用Lua实现一个名为Person的类: ```lua -- 创建一个Person类 Person = {} -- 定义Person的构造函数 function Person:new(name, age) local obj = {} obj.name = name obj.age = age setmetatable(obj, self) self.__index = self return obj end -- 定义Person的成员函数 function Person:sayHello() print("Hello, my name is " .. self.name .. ", I'm " .. self.age .. " years old.") end -- 创建一个Person对象 local person = Person:new("Tom", 20) -- 调用对象的成员函数 person:sayHello() ``` 在这个例子中,我们首先创建了一个空表Person,它代表一个类。然后我们定义了Person的构造函数new,用于创建Person的实例。在构造函数中,我们创建了一个新表obj,并将name和age属性赋值给它。然后我们使用setmetatable函数将obj的元表设置为Person,并将self设置为__index。这样做可以让obj继承Person的成员函数。最后,我们返回obj。 接下来,我们定义了Person的成员函数sayHello,它用于打印出人的姓名和年龄。在最后,我们创建了一个Person对象person,并调用它的成员函数sayHello。 如果你想要继承Person类,你可以创建一个新的表Student,并将它的元表设置为Person。这样做可以让Student继承Person的成员函数和属性。如果你想要重写某个成员函数或属性,你可以直接在Student表中重新定义它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值