多重继承:

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】面向对象编程(二)的更多相关文章

  1. Python进阶之面向对象编程(二)

    Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...

  2. Lua面向对象之二:类继承

    1.类继承 ①代码 Sharp = { } --① 父类 function Sharp:new() local new_sharp = { } self.__index = self --②,self ...

  3. Lua面向对象编程

    Lua中的table就是一种对象,看以下一段简单的代码: , b = } , b = } local tb3 = tb1 if tb1 == tb2 then print("tb1 == t ...

  4. python之路---面向对象编程(二)

    类的继承 1.在python3中,只有新式类,新式类的继承方式为:广度优先.而python2中,经典类的继承方式为:深度优先.那么我们来看看深度优先和广度优先的区别吧 如下图,为类之间的继承关系.B, ...

  5. lua面向对象编程 《lua程序设计》 16章 笔记

    Lua中的table就是一种对象,即它拥有状态.拥有独立于其值的标识(self).table与对象一样具有独立于创建者和创建地的征集周期 什么叫对象拥有独立的生命周期? Account = {bala ...

  6. Java面向对象编程(二)

    上一篇博文里总结了面向对象三大特性在Java中的体现.如今谈一谈Java中的抽象类,接口,内部类等特性. 一. 抽象类 public abstract class Shape { public int ...

  7. php面向对象编程(二)

    现在我们来了解一下面向对象的一个封装性的问题 封装性:在我的理解里面 可以理解为一个u盘 我们使用u盘的接口与电脑进行数据之间的交互 但是我们不能看到里面的结构 这个特性我们可以称为封装性 好处:利用 ...

  8. lua 面向对象编程类机制实现

    lua no class It is a prototype based language. 在此语言中没有class关键字来创建类. 现代ES6, 已经添加class类. prototype bas ...

  9. Python之路【第五篇续】:面向对象编程二

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABgQAAALaCAIAAABxja8cAAAgAElEQVR4nOzd6X9Tdd74/+uv+f5uzF

  10. Python入门之面向对象编程(二)python类的详解

    本文通过创建几个类来覆盖python中类的基础知识,主要有如下几个类 Animal :各种属性.方法以及属性的修改 Dog :将方法转化为属性并操作的方法 Cat :私人属性讲解,方法的继承与覆盖 T ...

随机推荐

  1. 解决IE6双倍边距BUG

    解决IE6双倍边距BUG,只要满足下面3个条件才会出现这个BUG: 1)要为块状元素; 2)要左侧浮动; 3)要有左外边距(margin-left); 解决这个BUG很容易,只需要在相应的块状元素的C ...

  2. THINKPHP ajax分页示例

    先把框架的page类改造一下 路径在ThinkPHP/Library/Think/Page.class.php文件 添加一个方法 ajax_show 代码如下 <?php /** * 组装分页链 ...

  3. Android移动网络如何抓取数据包

    1)下载tcpdump工具 tcpdump(dump the traffic on a network)是Linux中强大的网络数据采集分析工具之一,可以将网络中传送的数据包头完全截获下来提供分析.它 ...

  4. python2.0_day21_web聊天室一

    bbs系统项目中我们用到的ajax不多,但是在聊天室里用到的全是ajax,所以本项目的主要内容就是:前端使用ajax传输json格式的数据是本节的重点以及 前端函数的的使用.http协议的特点是:短链 ...

  5. 关于C中I/O缓冲区的解释

    用户程序调用C标准I/O库函数读写文件或设备,而这些库函数要通过系统调用把读写请求传给内核,最终由内核驱动磁盘或设备完成I/O操作.C标准库为每个打开的文件分配一个I/O缓冲区以加速读写操作,通过文件 ...

  6. php学习十四:抽象,接口和多态

    多态为面向对象编程的精华所在,js等面向过程的语言虽然可以模拟面向对象,但是毕竟模仿的永远比不上真的,所以了解而且会使用面向对象的多态是必不可少的 在了解多态之前,我们必须要了解接口,但是接口又是在抽 ...

  7. php学习九:存取器&魔术方法

    当声明属性的时候用到了private,那么的话只能本类中才能访问此属性,其他地方无法使用,这个时候需要给外界提供一些方法来使外界访问 方法一:存取器: 可以提供一个public的方法来使外界对类里面的 ...

  8. COM组件技术名称解释

    GUID:全局唯一标识. CLSID 或 ProgID :唯一地表示一个组件服务程序,那么根据这些ID,就可以加载运行组件,并为客户端程序提供服务了. IID :唯一的表示接口ID. COM 组件是运 ...

  9. PyQt4信号与槽

    事件 事件(Events)是GUI程序中很重要的一部分.它由用户或系统产生.当我们调用程序的exec_()方法时,程序就会进入主循环中.主循环捕获事件并将它们发送给相应的对象进行处理.奇趣公司(Tro ...

  10. HTML5文件拖拽上传记录

    JS文件: var FileName = ""; var FileStr = ""; (function () { function $id(id) { ret ...