在创建完cocos2d-x的lua项目后。打开项目的Resources中的extern.lua文件。里面有两个用于面向对象的方法。一个是用于克隆,一个是用于继承。

代码分析例如以下

--克隆一个对象
function clone(object)
--用于存储被訪问过的对象的表
local lookup_table = {}
local function _copy(object)
if type(object) ~= "table" then--假设类别不等于table。返回当前參数
return object
elseif lookup_table[object] then--假设备份表中存在该对象,则直接返回
return lookup_table[object]
end
local new_table = {}--创建一个新的表
lookup_table[object] = new_table--把即将被訪问过的表存到备份表
for key, value in pairs(object) do--遍历,赋值
new_table[_copy(key)] = _copy(value)
end
return setmetatable(new_table, getmetatable(object))--设置元表。用于继承
end
return _copy(object)
end --Create an class.
--创建类(类名。 父类)
function class(classname, super)
local superType = type(super)--获取父类的类型
local cls--定义一个变量。用来存储新创建的类的属性和函数 if superType ~= "function" and superType ~= "table" then--假设父类不是function类别或表类别。父类置空
superType = nil
super = nil
end if superType == "function" or (super and super.__ctype == 1) then--假设父类型是个function或者来自是c++的类
-- inherited from native C++ Object
print(superType)
cls = {} if superType == "table" then--来自引擎自带的c++类
-- copy fields from super
for k,v in pairs(super) do cls[k] = v end-
cls.__create = super.__create
cls.super = super
else--function
cls.__create = super
end cls.ctor = function() end--构造
cls.__cname = classname--类名
cls.__ctype = 1--指明派生与C++的类
--创建一个用于创建类的实例的方法
function cls.new(...)
local instance = cls.__create(...)
-- copy fields from class to native object
for k,v in pairs(cls) do instance[k] = v end--拷贝属性
instance.class = cls--创建一个属性,指向cls
instance:ctor(...)--构造
return instance
end else
-- inherited from Lua Object
if super then--假设父类不为空
cls = clone(super)--把类克隆,放到cls中
cls.super = super--创建一个属性,指向父类
else
cls = {ctor = function() end}--否则创建一个空的构造函数
end cls.__cname = classname--创建一个属性,指明类的名称
cls.__ctype = 2 -- lua 指明继承自lua自己定义的表
cls.__index = cls --把__index指向自己,用于形成一个继承的原型链
--创建一个用于创建类的实例的方法
function cls.new(...)
local instance = setmetatable({}, cls)--创建一个空表,并设置它的元表为cls,即继承cls
instance.class = cls--创建一个属性。指向cls
instance:ctor(...)--调用构造函数
return instance
end
end return cls
end

測试用比例如以下

在hello.lua文件里增加例如以下代码

--引入extern.lua
require "extern"
--test
local function test()
local luaTable = {x=1, y=2}
local N = class("N", luaTable)
cclog("继承lua自己定义的表,訪问父类的x属性值:x="..N.x) local testSprite = function ()
return CCSprite:create("farm.jpg")
end
local M = class("M", testSprite)
local m = M:new()
m.customField = "customField"
m:setOpacity(100)
cclog("用C++本地类的方式继承。訪问父类改动后的属性:"..m:getOpacity())
cclog("訪问子类属性:"..m:getOpacity())
end
test()

执行,结果例如以下

最新文章

  1. .NET 4.6.2正式发布带来众多特性
  2. mysql中间件研究(Atlas,cobar,TDDL)
  3. RBAC角色权限设计思路
  4. jquery之null的数组
  5. PHP zip压缩文件及解压
  6. SharePoint迁移数据到生产环境
  7. fastboot,bootloader,recovery
  8. php curl调用相关api
  9. cvs上传复制项目
  10. HttpClient 工具
  11. 关于web测试收集
  12. Stack和Vector源码分析
  13. javaFX的控制台实现
  14. web Function函数
  15. LeetCode算法题-Power of Four(Java实现-六种解法)
  16. html概述和基本结构
  17. VUE 动态给对象增加属性,并触发视图更新。
  18. Maven项目的结构分析
  19. 20155210 实验一 逆向与Bof基础
  20. 使用requests库实现多线程下载

热门文章

  1. iOS-绘制UIView之drawCGRect
  2. 逆向中静态分析工具——IDA初学者笔记之字符串分析
  3. 省选算法学习-dp优化-四边形不等式
  4. LoadRunner中请求HTTPS页面。
  5. Activity启动创建 (AcitivtyManageService,ActivityThread,Activity)
  6. ofbiz数据库表结构设计(2)- CONTACT_MECH
  7. [论文]A Link-Based Cluster Ensemble Approach for Categorical Data Clustering
  8. IMAGE_OPTIONAL_HEADER32 结构作用
  9. git的使用学习(七)githup和码云的使用
  10. 使用Nginx+FFMPEG搭建HLS直播转码服务器