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) ...
随机推荐
- java线程池ThreadPoolExecutor使用简介
一.简介线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:ThreadPoolExecutor(int corePoolSize, int m ...
- 如何打开 系统信息窗体和 DirectX诊断工具
开始---运行----msinfo32.exe 运行 位于C:\Program Files\Common Files\Microsoft Shared\Msinfo\msinfo32.exe,显示计算 ...
- type of 操作符和instanceof操作符的区别以及使用方法
经常见到用typeof和instanceof检测一个变量类型,作为前端小白经常不知道这两者具体的详细用法和区别,今天就整理一下谨记! javaScript中有6中数据类型: 1.Undefinde 2 ...
- tornado 学习笔记6 Application 源码分析
Application 是Tornado重要的模块之一,主要是配置访问路由表及其他应用参数的设置. 源代码位于虚拟运行环境文件夹下(我的是env),具体位置为env > lib>sit-p ...
- aps.net cored 新概念
Tag Helpers The EnvironmentTagHelper can be used to include different scripts in your views (for exa ...
- Java抽象类与接口的区别
很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题.本文我们将仔细讨论这些话题. 在讨论它们之间的不同点之前,我们先看看抽象类.接口各自的特性. ...
- 6个函数的output看JS的块级作用域
1. var output = 0; (function() { output++; }()); console.log(output); 函数对全局的output进行操作,因为JS没有块级作用域,所 ...
- c++字符串
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至 ...
- USACO 2014 FEB 银组
1.自动打字{Silver题1} [问题描述] 贝西新买了手机,打字不方便,请设计一款应用,帮助她快速发消息. 字典里有W(W<=30000)个小写字母构成的单词,所有单词的字符总数量不超过1, ...
- JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别
函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...