【Lua】面向对象编程(二)
多重继承:
module(...,package.seeall) local function search(k,plist)
for i=,#plist do
local v=plist[i][k]
if v then
return v
end
end
end --多重继承
function createClass(...)
local c={}
local parents={...}
setmetatable(c,{
__index=function(t,k)
return search(k,parents)
end
}) c.__index=c --c作为其实例的元表 c.new=function(self,o)
o=o or {}
setmetatable(o,c)
return o
end return c
end
注:
Lua实现多重继承的关键在于,__index元字段为一个函数
--多重继承
NamedAccount=MMultiInherit.createClass(MNamed.Named,MAccount.Account)
account=NamedAccount:new()
account:setName("Paul")
print(account:getName())
print(account:getBalance()
注:
如上创建一个继承自Named类和Account类的新类NamedAccount,需要调用createClass,创建NamedAccount对象account,Lua在account中无法找到setName时,会查找account元表中的__index字段,该字段为NamedAccount,由于NamedAccount无法提供setName字段,因此Lua查找NamedAccount元表中的__index字段,是一个函数,Lua就调用它,该函数现在Named中查找setName字段,最终在Named中找到一个非nil的值。
类的封装:
Lua实现类的封装(私密性)的做法是,通过两个table来表示一个对象,一个table用于保存对象的状态,另一个用于对象的操作,或者称为“接口”,对象本身通过第二个table来访问(即通过气接口的方法来访问)。
module(...,package.seeall) --[[
Lua 私密性实现,通过两个table表示一个对象,一个table用于保存对象的状态;另一个用于对象的操作,或者称为“接口”,
对象本身通过第二个table来访问,即通过其接口的方法来访问。
]]
function newAccount(initialBalance) --保存对象的状态
local self={
balance=initialBalance,
limit=1000.0
} local extra=function()
if self.balance > self.limit then
return self.balance *0.1
else
return
end
end local withdraw=function(money)
self.balance=self.balance-money
end local deposit=function(money)
self.balance=self.balance+money
end local getBalance=function()
return self.balance+extra()
end --返回对象的“接口”
return {
withdraw=withdraw,
deposit=deposit,
getBalance=getBalance
}
end
注:
如上所示,函数先创建了一个table,用于保存对象的内部状态,并将其存储在局部变量self中,然后再创建对象的方法,最后函数创建并返回一个供外部使用的对象,其中将方法名与真正的方法实现匹配起来。
这种设计给予了存储在self table中的所有东西完全的私密性,只能通过newAccount中创建的函数访问self table,另外可以定义私有的方法,他们类似于共有的方法,但是不放入接口中,如extra函数,即为私有方法。
【Lua】面向对象编程(二)的更多相关文章
- Python进阶之面向对象编程(二)
Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...
- Lua面向对象之二:类继承
1.类继承 ①代码 Sharp = { } --① 父类 function Sharp:new() local new_sharp = { } self.__index = self --②,self ...
- Lua面向对象编程
Lua中的table就是一种对象,看以下一段简单的代码: , b = } , b = } local tb3 = tb1 if tb1 == tb2 then print("tb1 == t ...
- python之路---面向对象编程(二)
类的继承 1.在python3中,只有新式类,新式类的继承方式为:广度优先.而python2中,经典类的继承方式为:深度优先.那么我们来看看深度优先和广度优先的区别吧 如下图,为类之间的继承关系.B, ...
- lua面向对象编程 《lua程序设计》 16章 笔记
Lua中的table就是一种对象,即它拥有状态.拥有独立于其值的标识(self).table与对象一样具有独立于创建者和创建地的征集周期 什么叫对象拥有独立的生命周期? Account = {bala ...
- Java面向对象编程(二)
上一篇博文里总结了面向对象三大特性在Java中的体现.如今谈一谈Java中的抽象类,接口,内部类等特性. 一. 抽象类 public abstract class Shape { public int ...
- php面向对象编程(二)
现在我们来了解一下面向对象的一个封装性的问题 封装性:在我的理解里面 可以理解为一个u盘 我们使用u盘的接口与电脑进行数据之间的交互 但是我们不能看到里面的结构 这个特性我们可以称为封装性 好处:利用 ...
- lua 面向对象编程类机制实现
lua no class It is a prototype based language. 在此语言中没有class关键字来创建类. 现代ES6, 已经添加class类. prototype bas ...
- Python之路【第五篇续】:面向对象编程二
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABgQAAALaCAIAAABxja8cAAAgAElEQVR4nOzd6X9Tdd74/+uv+f5uzF
- Python入门之面向对象编程(二)python类的详解
本文通过创建几个类来覆盖python中类的基础知识,主要有如下几个类 Animal :各种属性.方法以及属性的修改 Dog :将方法转化为属性并操作的方法 Cat :私人属性讲解,方法的继承与覆盖 T ...
随机推荐
- css属性cusor
<html> <body> <p>请把鼠标移动到单词上,可以看到鼠标指针发生变化:</p> <span style="cursor:au ...
- ios开发之--新手引导页的添加
以往在写启动页面的时候,有时候会直接在启动页里面写,或者自带的vc里面直接写,但是那样并不是很方便,启动页里面往往会添加很多的东西,所以封装成一个单独的类,可以直接使用,即便是后期的更换,或者是其他的 ...
- m2014-android->安卓开发在线案例
1.www.javaapk.com account: 克里斯 pwd: xiaobai 这个网站非常不错,各种例子,各种可供下载演示的项目,用了就知道,好处不多说,真心赞!
- OnGlobalLayoutListener用法
1.implements ViewTreeObserver.OnGlobalLayoutListener{} 2.mContentView.getViewTreeObserver().addOnGlo ...
- linux复制文件到指定的文件夹
copy命令 该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,同MSDOS下的copy命令一样,功能十分强大. 语法: cp [选项] 源文件或目录 目标文件或目录 说明:该命令把指 ...
- 使用C#语言实现一些功能
今天由于是周六,所以就没讲课啦,于是我就仔细看啦几道还没掌握的题,然后总结啦一下. 一.三级联动 像这个三级联动吧,感觉在做网站时间肯定会用到啦,但是那时间肯定不会是这样子做的啦,不可能把所有的省市区 ...
- mysql触发器的实战经验-不错的文章
1 引言 Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多 ...
- u盘装系统,u盘安装win7系统教程
http://www.upanboot.com/tool/anzhuang_win7.html 可以用本教程给笔记本.台式机.上网本和组装电脑通过U盘安装Win7系统. 步骤一.首先要准备一个至少8G ...
- 罗云彬win32汇编教程笔记 子函数的声明, 定义与调用
在主程序中用call指令来调用子程序. Win32汇编中的子程序也采用堆栈来传递参数,这样就可以用invoke伪指令来进行调用和语法检查工作. 一. 子程序的定义 子程序的定义方式如下所示. 子程序名 ...
- css基础---->学习html(一)
这里零散的总结一下观看css权威指南书的知识.生命中的诸多告别,比不辞而别更让人难过的,是说一句再见,就再也没见过. 一.首字母与首行的伪类 <dvi> <p>I love y ...