lua 脚本之高级篇 (面向对象的完全支持),有性能问题。
----------------------------------------------------------
--面向对象核心库
----------------------------------------------------------
----------------------------------------------------------
--base object
object = {}
function object:getName()
return "unknow"
end
function object:resetHashCode()
self.__hashcode = nil
self:getHashCode()
end
function object:getHashCode()
self.__hashcode = self.__hashcode or (os.time() + math.random())
return self.__hashcode
end
----------------------------------------------
-- create interface helper
function createInterface(object,name,func)
warning(object[name] == nil,"Interface exists,create fail" .. name)
end
function callInsterface(object,name,...)
local func = object[name]
return func(object,...)
end
function callmethod(object,name,...)
local func = object[name]
return func(object,...)
end
function implementInterface(object,name,func)
object[name] = func
end
function createAbstract(object,name,func)
object[name] = function(self)
warning(false,"not implement Abstract " .. name)
return nil
end
end
function createVirtualFunction(object,name,func)
implementInterface(object,name,func)
end
function override(object,name,func)
implementInterface(object,name,func)
end
function sealed(object)
object.__sealed = true
end
----------------------------------------------
--oop helpers
local function addctor(class)
assert(class,"class is nil value")
if class.ctor == nil then
class.ctor = function(self) end
end
end
function registerFun_getInstance(cls)
-- warning(cls.getInstance == false,"cls has function:getInstacnce")
cls.__instance = nil;
cls.getInstance =function()
if cls.__instance == nil then
assert(cls.new and type(cls.new)== "function","not found ctor function :new");
cls.__instance = cls:new()
return cls.__instance
end
return cls.__instance
end
end
---向对象中添加临时数据
function setTempVariable(object,key,value)
assert(key,"key is a nil value")
assert(value~=nil,"value is a nil value")
object.__tempData = object.__tempData or {}
object.__tempData["__"..key] = value
end
---查找对象中保存的临时数据
function getTempVariable(object,key)
assert(object,"object is a nil value")
assert(key,"key is a nil value")
if object.__tempData == nil then return nil end
return object.__tempData["__"..key]
end
function callSupper(instance,supperName,name,cls,...)
if instance ~= nil then
if instance.supper == nil then return end
if instance.supper[supperName] ~=nil then
for key, var in pairs( instance.supper[supperName]) do
if key == name then
local fun = var
local returnValue,e = pcall(fun,cls or instance,...)
assert(e==nil,e)
return returnValue,true
end
end
else
for key, var in pairs(instance.supper) do
if type(var) == "table" and key~="__index" and key ~= "__child" then
local returnValue,result = callSupper(var,supperName,name,instance,...)
if result == true then return returnValue,true end
end
end
end
if instance.__child ~=nil then
local returnValue,result = callSupper(instance.__child,supperName,name,cls,...)
if result == false and instance.__child.__child then
returnValue,result = callSupper(instance.__child.__child,supperName,name,cls,...)
end
return returnValue,true
end
end
return nil,false
end
---调用基类中的函数
function callSupperA(instance,supperName,name,...)
return callSupper(instance,supperName,name,instance,...)
end
local function copyAllSupper(class,base)
if base ~= nil and class ~= nil and base.supper ~= nil then
class.supper = class.supper or {}
for key, var in pairs(base.supper) do
if class.supper[key] == nil then
class.supper[key] = var
end
end
end
end
--继承帮助函数
--ext:扩展类,
--base:基类
--supper name
---------------------------------------------
--@param #table ext 当前类的定义
--@param #table base 当前类的要继承的类,一般也为table
--@param #string suppername 当前继承的基类的别名
--@return #table 一个新的对旬的实列
function inheritanceA(ext,base,suppername)
-- assert(ext,"not set ext object.")
-- assert(base,"not set base object.")
-- assert(base.__sealed == nil,"基类设置为了禁止继承.")
if base.__sealed ~= nil then
assert(base.__sealed == nil,"基类设置为了禁止继承.")
return
end
--metatable copy
local function setmetatableA(tag,source)
for k,v in pairs(source) do
if tag[k] == nil then
if type(v) == "table" and k ~= "__index" and k~= "__child" then
tag[k] = {}
setmetatableA (tag[k],v)
tag[k].__index = tag[k]
else
tag[k] = v
end
end
end
return tag
end
ext = setmetatableA(ext,base)
ext.__index = ext
--添加自己的构造函数
if ext.new == nil then
function ext.new ( self )
local instance = {}
setmetatableA(instance,self)
instance.__index = instance
instance:ctor()
instance:resetHashCode()
return instance,ext.supper
end
addctor(ext)
end
ext.supper = ext.supper or {}
setmetatableA(ext.supper,base)
ext.supper.__child = ext
ext.supper.__index = ext.supper;
---添加基类的默认构造函数
if ext.supper and ext.supper.new == nil then
---此逻辑的意义不大
ext.supper.new = ext.supper.new or function ( self )
local instance = {}
setmetatableA(instance,self)
instance:resetHashCode()
return ext.supper,ext.supper or {}
end
addctor(ext.supper)
end
if suppername ~= nil and type(ext.supper[suppername])~= "function" then
ext.supper[suppername] = ext.supper[suppername] or {}
setmetatableA(ext.supper[suppername],base)
ext.supper[suppername].__index = ext.supper[suppername]
end
ext.__index = ext;
---注册单列接口
registerFun_getInstance(ext)
return ext,ext.supper
end
---继承对象实例
--@param #table ext 当前对象的实例
--@param #table base 基类的实例
function inheritance(ext,base)
-- assert(false,"调用本函数只能通过supper来访问,如果多少继承,只有最后一次继承的会生效")
return inheritanceA(ext or {},base,"__supper")
end
---继承自model 文件
--@param #table ext 当前对象的实例
--@param #string mname 当前要继承的模块对象
function inheritanceM(ext,mname)
local obj = require (mname)
assert(obj~=nil,"load mode error,mode name:"..mname)
return inheritanceA(ext,obj,mname)
end
return object
lua 脚本之高级篇 (面向对象的完全支持),有性能问题。的更多相关文章
- Javascript高级篇-面向对象的特性
一.创建对象 1.1初始化器 var any={ name:"some", age:10, action:function(){ alert(this.name+":&q ...
- 要想用活Redis,Lua脚本是绕不过去的坎
前言 Redis 当中提供了许多重要的高级特性,比如发布与订阅,Lua 脚本等.Redis 当中也提供了自增的原子命令,但是假如我们需要同时执行好几个命令的同时又想让这些命令保持原子性,该怎么办呢?这 ...
- Lua学习高级篇
Lua学习高级篇 之前已经说了很多,我目前的观点还是那样,在嵌入式脚本中,Lua是最优秀.最高效的,如果您有不同的观点,欢迎指正并讨论,切勿吐槽.这个系列完全来自于<Programming in ...
- 第二十三篇:在SOUI中使用LUA脚本开发界面
像写网页一样做客户端界面可能是很多客户端开发的理想. 做好一个可以实现和用户交互的动态网页应该包含两个部分:使用html做网页的布局,使用脚本如vbscript,javascript做用户交互的逻辑. ...
- 第五篇:python高级之面向对象高级
python高级之面向对象高级 python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两 ...
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
[COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...
- Unity3D热更新之LuaFramework篇[07]--怎么让unity对象绑定Lua脚本
前言 在上一篇文章 Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的 中,我分析了由LuaBehaviour来实现lua脚本生命周期的方法. 但在实际使用中 ...
- Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween
在上一篇文章 Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法 中,我对LuaBehaviour脚本进行了扩展,添加了两个新的UI监听方法,也提到最好能单写一个脚本处理此 ...
- Redis分布式锁—SETNX+Lua脚本实现篇
前言 平时的工作中,由于生产环境中的项目是需要部署在多台服务器中的,所以经常会面临解决分布式场景下数据一致性的问题,那么就需要引入分布式锁来解决这一问题. 针对分布式锁的实现,目前比较常用的就如下几种 ...
随机推荐
- Ecplise添加XML自动提示
这里以struts.xml为例 第一步: 首先找到 struts2的核心jar包,我这里是struts2-core-2.3.20.jar用压缩工具打开或者解压下来
- 动态性能视图v$session_longops
v$session_longops This view displays the status of various operations that run for longer than 6 sec ...
- PHP 扒一扒这些题目都考了哪些知识点
1.模除 题目: <?php echo -10%3; *结果* -1 分析:其实这道题的知识点是在考模除和正负号的关系,那么我们看一段进阶的代码 <?php echo "10%3 ...
- demo 集合
github: https://github.com/zhanghaifeng1234565/ProjectFunctionCollect https://github.com/XY-W ...
- [BZOJ1010][HNOI2008]玩具装箱toy 解题报告
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...
- Linux emacs考场配置及对拍脚本
emacs配置(待补) (global-set-key [f9] 'compile) (global-set-key [f10] 'gud-gdb) (global-set-ket (kbd &quo ...
- windows注册表存储位置
win7/8/10 通常情况: HKEY_LOCAL_MACHINE \SYSTEM : \system32\config\system HKEY_LOCAL_MACHINE \SAM : \syst ...
- Django-urls路由分发
例如:127.0.0.0:8000/blog/lucaq.html,当有多个应用时,需要在blog应用下进行路由,我们在blog应用下做一个urls路由分发,就需要include模块实现. 导 ...
- passwd讲解
root:$dffjioowwf/:16274:0:999999:7::: 1用户名:密码:最近修改密码的日期:密码不能更改的天数:密码过期时间:密码需要更改期限到拉前7发出警告:宽限天数:帐号过期时 ...
- android 使用开源库zxing生成二维码,扫描二维码【转】
转自:http://blog.csdn.net/qq_16064871/article/details/52422723 zxing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库 ...