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) ...
随机推荐
- iOS 隐藏键盘的几种常见方法
1.设置return key,然后为Did End On Exit事件添加响应方法,并在方法内添加代码:[self.textfieldName resignFirstResponder]. 2.将背景 ...
- 如何使用ArcGIS Online的地图数据作为底图
1.添加数据-GIS服务器 2.选择添加ArcGIS Server 3.使用GIS服务,下一步 4.输入url为http://cache1.arcgisonline.cn/ArcGIS/service ...
- Leetcode Trapping Rain Water
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- Qt Visual Studio Add-in 导出的 .pri 怎么用?
今天咱们介绍一下 Qt Add-in 导出的 pri 文件怎么用. 一般需要导出这个文件, 主要应该是跨平台编译的需求, 所以这个文件里包含的东西会比较少, 咱们看下导出的文件是什么样子的: # ...
- cookie小析
cookie用于存储数据,当用户访问了某个网站(网页)时,我们就可以通过cookie来向访问者电脑上存储数据1.不同的浏览器存放的cookie位置不同,也不能通用2.cookie的存储是以域名的形式进 ...
- [Android]新版的sdk中新建一个android应用,增加的PlaceholderFragment这个静态类发生的事情
1,首先发生的是有两个布局xml,一个activity_main.xml,一个是fragment_main.xml一开始没在意,后来仔细看了原来是新功能的fragment概念等于多个场景在这个acti ...
- Java实现验证码制作之一自己动手
以前弄验证码都是现找现用,下面是自己跟着敲代码弄好的,记录一下,分享给大家. 我这里用的是Servlet ,Servlet代码如下 import java.awt.Color;import java. ...
- javascript学习之运动框架
模仿新浪博客首页的,最新评论: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"&g ...
- User interface
Styles and Themes value/style <style name="CodeFont" parent="@android:style/TextAp ...
- jQuery系列:五个模块总结
Query插件,以备并希望在前端方面有所长进.请批评指正. 一,类型判断全解 JQuery判断类型扩展方法:$.type() /*type: function( obj ) { if ( obj == ...