Lua类和类继承实现
Lua本身是不能像C++那样直接实现继承,但我们可以用万能的table表来实现。
以下我总结了三种方式的类以及继承的实现
第一、官方的做法,使用元表实现 原理参照《Programming in lua》
Object.lua
Object = {class_id = }
function Object:new(o)
o = o or {}
setmetatable(o,self) -- 对象o调用不存在的成员时都会去self中查找,而这里的self指的就是Object
self.__index = self
return o
end
---以下我们创建对象来测试以下
local o1 = Object:new()
o1.class_id = 11;
local o2 = Object:new()
o2.class_id = 22;
以上我们就利用元表实现了一个类,但这个类没有任何行为,以下我们继承上面的类
DisplayObject.lua
DisplayObject = Object:new()
-- 现在为止,DisplayObject只是Object的一个实例,注意以下代码 D = DisplayObject:new(width = ,height = ) -- DisplayObject从Object继承了new方法,当new执行的时候,self参数指向DisplayObject。所以,D的metatable是DisplayObject,__index 也是DisplayObject。这样,D继承了DisplayObject,后者继承了Object。 ---在Lua中面向对象有趣的一个方面是你不需要创建一个新类去指定一个新的行为。
第二、复制表方式
我们同样使用上面的Object,换种写法
--Lua中的面向对象
--[[
复制表方式面向对象
参数为一张表,通过遍历这张表取值,赋给一张空表,最后返回新建的表,来达到克隆表
]]
function cloneTab(tab)
local ins = {}
for key, var in pairs(tab) do
ins[key] = var
end
return ins
end Object = {class_id = 1} function Object.new()
local o = cloneTab(Object)
return o
end -- 使用这个类
local p = Object.new()
继承实现
DisplayObject.lua
--[[
复制表
第一参数是目标表,第二个参数是需要复制的表
通过遍历tab来取值将它赋值到目标表中
]]
function copy(dist,tab)
for key, var in pairs(tab) do
dist[key] = var
end
end DisplayObject = {} function DisplayObject.new()
local ss = Object.new()
copy(ss,DisplayObject)
return ss
end
local p1 = DisplayObject.new()
第三,使用函数闭包的形式实现面向对象
--以函数闭包的形式实现面向对象 --定义一个方法,函数闭包实现一个类的概念
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()
PS;关于继承类,cocos2d-x v3版本提供一个更好更便捷的方式来实现。使用class全局方法创建
如
require "Object"
GameObject = class("GameObject",function ()
return Object:new()
end)
function GameObject:create()
return GameObject.new()
end
-- 以上就实现了一个继承过程
在cocos引擎源代码下有extern.lua这个文件,里面就声明了class这个方法
extern.lua
function clone(object)
local lookup_table = {}
local function _copy(object)
if type(object) ~= "table" then
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
superType = nil
super = nil
end if superType == "function" or (super and super.__ctype == ) then
-- inherited from native C++ Object
cls = {} if superType == "table" then
-- copy fields from super
for k,v in pairs(super) do cls[k] = v end
cls.__create = super.__create
cls.super = super
else
cls.__create = super
end cls.ctor = function() end
cls.__cname = classname
cls.__ctype = 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
instance:ctor(...)
return instance
end else
-- inherited from Lua Object
if super then
cls = clone(super)
cls.super = super
else
cls = {ctor = function() end}
end cls.__cname = classname
cls.__ctype = -- lua
cls.__index = cls function cls.new(...)
local instance = setmetatable({}, cls)
instance.class = cls
instance:ctor(...)
return instance
end
end return cls
end function schedule(node, callback, delay)
local delay = cc.DelayTime:create(delay)
local sequence = cc.Sequence:create(delay, cc.CallFunc:create(callback))
local action = cc.RepeatForever:create(sequence)
node:runAction(action)
return action
end function performWithDelay(node, callback, delay)
local delay = cc.DelayTime:create(delay)
local sequence = cc.Sequence:create(delay, cc.CallFunc:create(callback))
node:runAction(sequence)
return sequence
end
Lua类和类继承实现的更多相关文章
- lua中基类和“继承机制”
基类:基类定义了所有对于派生类来说普通的属性和方法,派生类从基类继承所需的属性和方法,且在派生类中增加新的属性和方法. 继承:继承是C++语言的一种重要机制,它允许在已定义的类的基础上产生新类. lu ...
- UML类图关系--继承(泛化)、实现、关联、聚合、组合、依赖
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composi ...
- Action类为何要继承ActionSupport
Action类为何要继承ActionSupport 理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承com.open ...
- java类的封装 继承 多态
1.猜数字小游戏 package cn.jiemoxiaodi_02; import java.util.Scanner; /** * 猜数字小游戏 * * @author huli * */ pub ...
- 接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)?
接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)? 1. 接口可以继承接口. 2. 抽像类可以实现(implements)接 ...
- C++学习19 类的多继承
在前面的例子中,派生类都只有一个基类,称为单继承.除此之外,C++也支持多继承,即一个派生类可以有两个或多个基类. 多继承容易让代码逻辑复杂.思路混乱,一直备受争议,中小型项目中较少使用,后来的 Ja ...
- python 零散记录(七)(下) 新式类 旧式类 多继承 mro 类属性 对象属性
python新式类 旧式类: python2.2之前的类称为旧式类,之后的为新式类.在各自版本中默认声明的类就是各自的新式类或旧式类,但在2.2中声明新式类要手动标明: 这是旧式类为了声明为新式类的方 ...
- 24 类:组合 继承 super关键字 面向对象的三大性
组合 组合:自定义类的对象作为另外一个类的属性 class Teacher: def __init__(self, name, age): self.name = name self.age = ag ...
- Java开发笔记(四十八)类的简单继承
前面介绍了类的基本用法,主要是如何封装一个类的各项要素,包括成员属性.成员方法.构造方法等,想必大家对类的简单运用早已驾轻就熟.所谓“物以类聚,人以群分”,之所以某些事物会聚在一起,乃是因为它们拥有类 ...
- 类与对象 && 继承
以下是本人的对类与对象.继承的一些理解,如有错误之处万望谅解,如有朋友愿意指正,十分乐意,万分感谢! 类与对象 类与对象是学习编程的基础(大概吧),那么何为类?何为对象呢? 一.简 ...
随机推荐
- PHPFarm - How to run multiple versions of PHP on the same computer
How to Run Multiple Versions of PHP on One Server 转载:http://www.sitepoint.com/run-multiple-versions- ...
- 2016041601 - maven用途
以前只是使用maven只是当成jar依赖管理工具,并没有想到它有多么厉害的功能.现在看书系统学习maven才发现它的强大之处.个人认为通过博客去学习掌握一门技术,这是很低层次的学习方法.学习金字塔,学 ...
- uCGUI动态内存管理
动态内存的堆区 /* 堆区共用体定义 */ typedef union { /* 可以以4字节来访问堆区,也可以以1个字节来访问 */ ]; /* required for proper aligne ...
- IE浏览器窗口合并
百度经验:如何在IE上设置多窗口合并为单窗口(可切换)?
- appfabric 简单应用
http://msdn.microsoft.com/en-us/library/ee790941(v=azure.10).aspx Preparing the Visual Studio Projec ...
- uitableviewcell 自适应大小 参考
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { ...
- Bootstrap 分页功能
function bootstrappage() { var options = { currentPage: currentPage, totalPages: totalPages, size: ' ...
- 递归解析XML
package com.app.test; import java.io.InputStream; import java.util.List; import org.dom4j.Attribute; ...
- iis下设置默认页
IIS设置设默认页 计算机-->右键管理-->服务器和应用程序-->Internet信息服务 -->网站-->你发布的网站名-->功能视图-->IIS大类里- ...
- Asp.Net中的三种分页方式
Asp.Net中的三种分页方式 通常分页有3种方法,分别是asp.net自带的数据显示空间如GridView等自带的分页,第三方分页控件如aspnetpager,存储过程分页等. 第一种:使用Grid ...