lua下的简单OO实现
1.概述
2.主要的知识点
3.历次实现
第一版;new的时候将自己作为新对象的元表。
---------------------------------------------------------------------------------------
baseclass={}
function baseclass:new (o)
o = o or {} -- create object if user does not provide one
o.super=baseclass -- keep base class
setmetatable(o, self)
self.__index = self
return o
end function baseclass:classname()
return "baseclass"
end function baseclass:ctor()
return "baseclassctor"
end a1class=baseclass:new()
a1class.classname()
function a1class:classname()
return "a1class"
end
print (a1class.classname()=="a1class")-- check overwrite
print (a1class.ctor()) --check Inheritance
--print (a1class.super:classname()) ---------------------------------------------------------------------------------------
第二版:适用方法替代表table
------------------------------------------------------
--V2
------------------------------------------------------
baseclass={}
baseclass.level=
baseclass.__index=baseclass function baseclass:new (o)
o = o or {} -- create object if user does not provide one
o.super=self -- keep base class
setmetatable(o,
{__index=function(tablename,keyname)
-- two way to do it
return self[keyname] -- or return o.super[keyname] end
}
)
o.__index=o
--self.__index = self
return o
end function baseclass:classname()
return "baseclass"
end function baseclass:ctor()
return "baseclassctor"
end ------------------------------------------------------
a1class=baseclass:new()
a1class.classname()
function a1class:classname()
return "a1class"
end --[[
function a1class:new (o)
o = o or {} -- create object if user does not provide one
o.super=self -- keep base class
setmetatable(o,
{__index=function(tablename,keyname)
return self[keyname] end
}
)
o.__index=o
--self.__index = self
return o
end
--]]
--- print (a1class:classname()=="a1class")-- check overwrite
print (a1class.level==)-- check base class 's property
print (a1class:ctor()=="baseclassctor") --check Inheritance
print ("-----------b-----------") b1Class=a1class:new()
print (b1Class:ctor()=="baseclassctor")
print (b1Class:classname()==a1class:classname())--check
------------------------------------------------------
第三版:若子类需要则传递保存下来
------------------------------------------------------
--V3
------------------------------------------------------
baseclass={}
baseclass.level=
baseclass.__index=baseclass function baseclass:new (o)
o = o or {} -- create object if user does not provide one
o.super=self -- keep base class
setmetatable(o,
{__index=function(tablename,keyname)
-- two way to do it
print ("invoke func "..keyname..
" from "..tostring(tablename).." now is "..tostring(self) )
func= self[keyname]
if func then
o[keyname]=func
--print ("keep it "..keyname.." in "..tostring(self))
end return func -- or return o.super[keyname] end
}
)
o.__index=o
--self.__index = self
return o
end function baseclass:classname()
return "baseclass"
end function baseclass:ctor()
return "baseclassctor"
end ------------------------------------------------------ a1class=baseclass:new()
a1class.classname()
function a1class:classname()
return "a1class"
end print (a1class:classname()=="a1class")-- check overwrite
print (a1class.level==)-- check base class 's property
--print (a1class:ctor()=="baseclassctor") --check Inheritance b1Class=a1class:new()
function b1Class:classname()
return "b1Class"
end --print (b1Class:ctor()=="baseclassctor")
print (b1Class:classname()~=a1class:classname())--check
print (b1Class.level==)-- check base class 's property print ("--------check drived class search")
print (b1Class:ctor())-- check base class 's property
print (b1Class:ctor())-- check base class 's property
------------------------------------------------------ print ("baseclass is "..tostring(baseclass))
print ("a1class is "..tostring(a1class))
print ("b1Class is "..tostring(b1Class))
第四版:替代new的方式直接一个函数生成类
第四版:替代new的方式直接一个函数生成类
drivedclass==class(baseclass)
.直接替代call方法
.function 方式 ------------------------------------------------------
--V4
------------------------------------------------------
function class (baseclass) local o = {}
o.super=baseclass -- keep base class
setmetatable(o,
{__index=function(tablename,keyname) -- print ("invoke func "..keyname..
-- " from "..tostring(tablename).." now is "..tostring(baseclass) ) func= baseclass[keyname]
if func then
o[keyname]=func
--print ("keep it "..keyname.." in "..tostring(self))
end return func -- or return o.super[keyname] end
}
) return o
end ------------------------------------------------------
baseclass=class()
baseclass.level=
function baseclass:classname()
return "baseclass"
end function baseclass:ctor()
return "baseclassctor"
end a1class=class(baseclass) function a1class:classname()
return "a1class"
end print (a1class:classname()=="a1class")-- check overwrite
print (a1class.level==)-- check base class 's property
print (a1class:ctor())-- check base class 's property
--print (a1class:ctor()=="baseclassctor") --check Inheritance b1Class=class(a1class)
--function b1Class:classname() return "b1Class" end
print (b1Class:classname())-- y ------------------------------------------------------end
第五版 尝试跨越中间,从基类复制到最终的派生类
------------------------------------------------------
--V5
------------------------------------------------------
--o = {}
local indexlevel=
-----------------------------
function class (baseclass) local o = {}
o.indexlevel=
o.super=baseclass -- keep base class setmetatable(o,
{__index=function(tablename,keyname) print ("invoke func "..keyname..
" from "..tostring(tablename).." now is "..tostring(baseclass) ) print (" enter indexlevel: "..indexlevel)
indexlevel=indexlevel+ func= baseclass[keyname] indexlevel= indexlevel-
print (" leave indexlevel: "..indexlevel)
if indexlevel== then
if func then
o[keyname]=func
print ("keep it "..keyname.." in "..tostring(baseclass))
end
end
return func end
}
)
---
o.tablefunctions={} return o
end ------------------------------------------------------
baseclass=class()
baseclass.level=
function baseclass:classname()
return "baseclass"
end function baseclass:ctor()
return "baseclassctor"
end a1class=class(baseclass) function a1class:classname()
return "a1class"
end b1Class=class(a1class) print ("--------check drived class search")
print (b1Class:ctor())-- check base class 's property
print (b1Class:ctor())-- check base class 's property ------------------------------------------------------
print ("-------------------------------")
print ("baseclass is "..tostring(baseclass))
print ("a1class is "..tostring(a1class))
print ("b1Class is "..tostring(b1Class))
第六版 学习云风 1:·自定义一个函数容器
------------------------------------------------------
--V6
------------------------------------------------------ -------------------------------
--o = {}
-- local indexlevel=0
local _class={} -- store global var
-----------------------------
function class (baseclass)
local o = {}
o.super=baseclass -- store base class
_class[o]={} --存储新到的方法
local storeNewFunc=function(tablename,key,value)
print ("set func "..key.." in "..tostring(tablename).." v is "..tostring(value) )
_class[o][key]=value--store new func into o
end -- if base exist then add func lookup
local searchFunc=function(t,key)
local func=_class[t][key] if not func and baseclass then
print (" search baseclass "..key)
func=baseclass[key]
if func then
o[key]=value
end
end if func then
print (" func "..key.." found ") else
print (" func "..key.." nof found ")
end return func end setmetatable(o,{__index=searchFunc,__newindex=storeNewFunc }) return o
end ------------------------------------------------------ baseclass=class()
print ("-------------------------------")
function baseclass:classname()
return "baseclass"
end
print ("-------------------------------") --print ("classname= "..baseclass:classname())-- check overwrite
print ("-------------------------------")
--print ("classname= "..baseclass:classname())-- check overwrite function baseclass:ctor()
return "baseclass_ctor"
end a1class=class(baseclass) function a1class:classname()
return "a1class"
end print ("---test class----------------------------")
print (a1class:classname()=="a1class")-- check overwrite
print (a1class:ctor()=="baseclass_ctor")-- check overwrite
print ("---test class 1----------------------------")
b1Class=class(a1class)
print ("---test class 2----------------------------") print (b1Class:ctor())
print ("---test class 3----------------------------")
print (b1Class:ctor()) ------------------------------------------------------
print ("-------------------------------")
print ("baseclass is "..tostring(baseclass))
print ("a1class is "..tostring(a1class))
print ("b1Class is "..tostring(b1Class))
第七版 学习云风2:分离classtype和object
local _class={}
-----------------------------
function class (baseclass)
local o = {}
o.super=baseclass -- store base class ,not nessary
_class[o]={}
o.new = function (...)
local instance={}--instance
setmetatable(instance,{__index=o,__newindex=o})
--setmetatable(instance,{__index=searchFunc,__newindex=storeNewFunc })
return instance
end
--存储新到的方法
local storeNewFunc=function(tablename,key,value)
print ("set func "..key.." in "..tostring(tablename).." v is "..tostring(value) )
_class[o][key]=value--store new func into o
end
--方法查找 if base exist then add func lookup
local searchFunc=function(t,key)
local func=_class[t][key]
if not func and baseclass then
print (" search baseclass "..key)
func=baseclass[key]
if func then
o[key]=func
end
end
if func then
print (" func "..key.." found ")
else
print (" func "..key.." nof found ")
end
return func
end
setmetatable(o,{__index=searchFunc,__newindex=storeNewFunc })
return o
end
------------------------------------------------------
baseclass=class()
print ("-------------------------------")
function baseclass:classname()
return "baseclass"
end
print ("-------------------------------")
--print ("classname= "..baseclass:classname())-- check overwrite
print ("-------------------------------")
--print ("classname= "..baseclass:classname())-- check overwrite
--dump(_class)
function baseclass:ctor()
return "baseclass_ctor"
end
a1class=class(baseclass)
function a1class:classname()
return "a1class"
end
b1Class=class(a1class)
bb1=b1Class.new()
print ("---test class 5----------------------------")
print (bb1:ctor())
print (bb1:ctor())
print (bb1:ctor())
4.个人小结
5.参考资料
lua下的简单OO实现的更多相关文章
- lua Getter&Setter简单实现
lua是一门简单的语言,不带类和属性封装,但可以使用lua强大的元表模拟实现: class.lua local type = type local rawset = rawset local setm ...
- ios下最简单的正则,RegexKitLite
ios下最简单的正则,RegexKitLite 1.去RegexKitLite下载类库,解压出来会有一个例子包及2个文件,其实用到的就这2个文件,添加到工程中.备用地址:http://www.coco ...
- cocos2d-x lua与c++简单交互
cocos2d-x lua与c++简单交互 version: cocos2d-x 3.6 本文讲述lua与c++的一些简单交互: lua通过消息方式调用c++无参接口 c++调用lua带参接口 1.通 ...
- Linux下一个简单的日志系统的设计及其C代码实现
1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息, 包括:变量名称及其值.消息结构定义.函数返回 ...
- VIM - visual selection 模式下的简单操作
1. 概述 vim 的 visual selection 模式下的简单操作 2. visual selection 模式 概述 可视化选择 可视化选择 vim 的一种专门用来选择的模式 可以提供相对于 ...
- [Android] Android MVP 架构下 最简单的 代码实现
Android MVP 架构下 最简单的 代码实现 首先看图: 上图是MVP,下图是MVC MVP和MVC的区别,在于以前的View层不仅要和model层交互,还要和controller层交互.而 ...
- Windows环境下ELK简单搭建记录
前言 ELK已经是一套成熟的日志解决方案,虽然出现了好久,今日才终于研究了一下,不过是在windows平台上安装的. 搭建步骤 下载软件 安装软件 修改配置文件 启动软件 集成测试 下载软件 首先从官 ...
- (转)live555在Linux下最简单地实现实时流媒体点播
通过Live555交叉编译后运行发现,上面实现的流媒体实时通过文件服务器的文件点播,没有相关的流媒体实现方式, 但在Linux下,可以通过某些技巧实现Live555服务器实时流媒体服务器,并且是傻瓜式 ...
- nginx Win下实现简单的负载均衡(2)站点共享Session
快速目录: 一.nginx Win下实现简单的负载均衡(1)nginx搭建部署 二.nginx Win下实现简单的负载均衡(2)站点共享Session 三.nginx Win下实现简单的负载均衡(3) ...
随机推荐
- 【淘淘】Quartz之集群利弊
一.前言: 虽然单个Quartz实例能给予我们很好的任务job调度能力,但它不能满足典型的企业需求,如可伸缩性.高可靠性满足.假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成 ...
- sublime text3点击ctrl+B无法运行Python程序?
1.打开sublime text 3 ,选择 tools-->Build System-->New Build System.... 2.将下面代码块复制进新文件中,并命名为Python. ...
- java.lang.NoClassDefFoundError:
异常信息:十一月 10, 2016 5:20:15 下午 org.apache.catalina.core.StandardContext loadOnStartup严重: Servlet /mgr ...
- Ubuntu 16.04 install 搜狗输入法
1.#先添加以下源 sudo add-apt-repository ppa:fcitx-team/nightly 2.#添加源之后需要更新一下系统 sudo apt-get update 3.#开始安 ...
- java.lang.NoClassDefFoundError: javax/el/ELResolver 问题解决
HTTP Status 500 - java.lang.NoClassDefFoundError: javax/el/ELResolver type Exception report message ...
- 如何解决google ping不通的问题。
1. 用http://ping.chinaz.com/ ping google的域名. 2. 会ping出很多ip,但是chinaz用的是测试网点去ping的,不是你本地宽带, 所以把ping出ip拷 ...
- 浅谈WebLogic和Tomcat
J2ee开发主要是浏览器和服务器进行交互的一种结构.逻辑都是在后台进行处理,然后再把结果传输回给浏览器.可以看出服务器在这种架构是非常重要的. 这几天接触到两种Java的web服务器,做项目用的Tom ...
- Windows下的Memcache安装 linux下的Memcache安装
linux下的Memcache安装: 1. 下载 memcache的linux版本,注意 memcached 用 libevent 来作事件驱动,所以要先安装有 libevent. 官方网址:http ...
- bzoj 4503 两个串
Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字符. Input 两行两个字 ...
- windows2013 iis 配置 xcache
本帖最后由 artsharp 于 2010-6-8 09:06 编辑XCache是一种新的php缓存器,经过测试,在Windows下效果比同类软件强很多.实际测试效果如下(非科学方法):原网页平均执行 ...