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

Lua中的table就是一种对象,即它拥有状态、拥有独立于其值的标识(self)、table与对象一样具有独立于创建者和创建地的征集周期

什么叫对象拥有独立的生命周期?

Account = {balance = 0}

function Account.withdraw(v)
    Account.balance = Acount.balance-v
end

--则可进行如下调用

Account.withdraw(v)

--[[在函数中使用全局名称Account不是个了习惯
    因为这个函数只能针对特定对象使用(此例中
    的Account,并且这个特定对象必须存储在特定
    全局变量中,如果改变了对象名称,withdraw
    就不工作了

a = Account;Account = nil
a.withdraw(100.00)  --错误

这种行为违反了面向对象的特性,即对象拥有独立的生命周期,有一种灵活的方法即指定一项操作所用的“接者者”,因此需要一个额外的参数来表示该接受者。这个参数通常称为self或this


function Account.withdraw(self,v)
    self.balance = self.balance - v
    print(self.balance);
end

下面调用该方法,必须指定期作用对象

a1 = Account;Account = nil
a1.withdraw(a1,100.00)  --100

self参数是所有面像对象语言的一个核心。大多数面向对象语言都能对程序员隐藏部分self参数。lua只需要用冒号则能隐藏该参数,即可重写为

Account = {balance = 0}
function Account:withdraw(v)
    self.balance = self.balance - v
    print(self.balance);
end

a1 = Account;Account = nil
a1:withdraw(100.00)  --100

16.1 类

lua实现原型是依赖于元表。如果两个对象a,b,要让b做为a的一个原型只需要输入以下语句:

setmetatable(a,{__index=b})

加到先前银行账号示例。为了创建更多与Accoun行为类似的账号(这里的类似指具有相同方法),可以让这些新对象从Account中继承这些操作。具体做法就是使用 __index元方法,可以应该一项小优化,则无须创建一个额外的table作为账号对象元表。而是使用Account table自身作为对象元表。

Account = {balance = 0,
    withdraw = function(self,v)
                    self.balance = self.balance - v
                    print(self.balance);
               end
            }

function Account:deposit(v)
    self.balance = self.balance + v
    print(self.balance);
end

function Account:new(o)
    o = o or {}  --如果用户没有提供table则创建一个
    setmetatable(o,self)
    self.__index = self
    return o
end

a = Account:new{balance = 0}
a:deposit(100.00) --输出100

如上代码所示实际上table a 只有一个成员balance = 0,那它为什么调用deposit方法确成功了呢,这就是__index元方法的功能所在了。__index元方法在table找不到成员时会去寻找__index元方法所在的table里找方法。而这样就是lua继承的概念。

当创建新账户时,a会将Account作为其元表。而当调用a:deposit(10

--基类 Account
Account = {balance = 0}
function Account::withdraw(self,v)
    self.balance = self.balance - v
    print(self.balance);
end

function Account:deposit(v)
    self.balance = self.balance + v
    print(self.balance);
end

function Account:new(o)
    o = o or {}  --如果用户没有提供table则创建一个
    setmetatable(o,self)
    self.__index = self
    return o
end

--子类 SpecialAccount继承自 Account
SpecialAccount = Account:new()

s = SpecialAccount:new{limit=1000.00}  --s继承自SpecialAccount
s:deposit(100.00)  --最终会在Account里找见deposit的实现

--SpecialAccount之所有特殊是因为可以重定义那些从基类继承来的方法,编写一个方法的新实现只需要
function SpecialAccount:withdraw(v)
    if v - self.balance >= self:getLimit() then
        error"insufficient funds"
    end
    self.balance = self.balance - v
end

function SpecialAccount:getLimit()
    return self.limit or 0
end

--s表示一个特殊客户 这个客户透支额度总是其余额的10%,那么可以只修改这个对象
function s:getLimit()
    return self.balance * 0.10
end

0.00)时,就调用了a.deposit(a,100.00),lua无法从table a中找到条目deposit,那么它会进一步寻找__元表__index的值。最终调用为

getmetatable(a).__index.deposit(a.100.00)

a的元表是Account,Account.__index 也是Account上面这个可以化简为:

Account.desposit(a,100.00)

继承不仅可以用作方面,也可以用作没有的字段 ,如下所示

b = Account.new()
print(b.balance) --0

16.2继承

时间: 2024-10-24 07:17:35

lua面向对象编程 《lua程序设计》 16章 笔记的相关文章

Lua面向对象编程学习笔记_Lua

其实 Lua 中的 table 是一种对象,因为它跟对象一样,有其自己的操作方法: 复制代码 代码如下: Role = { hp = 100 } function Role.addHp(hp)     Role.hp = Role.hp + hp end   Role.addHp(50) print(Role.hp) 上面代码创建了一个名为 Role 对象,并有一个 addHp 的方法,执行 "Role.addHp" 便可调用 addHp 方法. 不过上面对象 Role 是以全局变量的

Lua面向对象编程之类的简单实现方式_Lua

先来看一段程序: 复制代码 代码如下: function create(name, id)       local obj = { name = name, id = id }       function obj:SetName(name)         self.name = name       end       function obj:GetName()         return self.name       end       function obj:SetId(id)

Lua中函数与面向对象编程的基础知识整理_Lua

函数 1. 基础知识调用函数都需要写圆括号,即使没有参数,但有一种特殊例外:函数若只有一个参数且参数是字面字符串或table构造式,则圆括号可有可无,如dofile 'a.lua',f{x=10, y=20}. Lua为面向对象式的调用提供冒号操作符的特殊语法,如o.foo(o, x)等价于o:foo(x).和Javascript类似,调用函数时提供的实参数量可以与形参数量不同,若实参多了则舍弃,不足则多余的形参初始化为nil. 1.1 多重返回值 Lua允许函数返回多个结果,函数返回如retu

《JavaScript面向对象编程指南》——第1章 引言1.1 回顾历史

第1章 引言 众所周知,时下所流行的这些Web应用,例如Yahoo! Maps.Google Maps.Yahoo! Mail.My Yahoo!.Gmail.Digg以及YouTube等都有一些明显的共同特征,即:它们都是Web2.0时代的应用程序,都有非常丰富的人性化交互界面,而这往往意味着大量的JavaScript应用.事实上,JavaScript最初也只不过是一种内嵌于HTML语句中的单行式脚本语言.但如今已经今非昔比了,对于它今天所拥有的面向对象特性来说,无论是在可重用性方面,还是在可

Lua面向对象之类和继承_Lua

终于来了,在Lua中的面向对象编程,相信目前学习Lua的大部分人都是为了开发手机网游吧. 而且基本都是奔着脚本语言的热更新特性去的,所以全脚本开发变得十分流行. 对于普及不太广的Lua(相对于C++.Java等主流语言),需要短时间上手开发游戏,对新手而言不算简单. 所以大家才更习惯于继续用面向对象思想去折腾Lua吧~ 好了,不唠叨了,我最不喜欢唠叨了.(小若:是是是,你一点都不唠叨,赶紧开讲!) 1.类的对象 至于如何创建一个类,大家已经很清楚了,就是一个table而已. 那么,要使用这个类去

Lua面向对象之类和继承浅析

  这篇文章主要介绍了Lua面向对象之类和继承浅析,本文讲解了一些Lua面向对象的一些知识,需要的朋友可以参考下 Lua中的table就是一种对象,但是如果直接使用仍然会存在大量的问题,如下: 代码如下: Account = {balance = 0} function Account.withdraw(v) Account.balance = Account.balance - v end --下面是测试调用函数 Account.withdraw(100.00) 在上面的withdraw函数内

第六章 Python类(面向对象编程)

什么是面向对象编程?    面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构.Python就是这种编程语言.    面向对象程序设计中的概念主要包括:对象.类.继承.动态绑定.封装.多态性.消息传递.方法.    1)对象:类的实体,比如一个人.    2)类:一个共享相同结构和行为的对象的集合.通俗的讲就是分类,比如人是一类,动物是一类.    3)继承:类之间的关系,比如猫狗是一类,他们都有四条腿,狗继承了这个四条腿,拥有了

简明Python教程学习笔记_6_面向对象编程

简介 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象这个类的 实例 .这类似于你有一个int类型的变量,这存储整数的变量是int类的实例(对象). 类(Class)::用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 对象:          通过类定义的数据结构实例.对象包括两个数据成员(类变量和实例变量)和方法. 实例化:      创建一个类的实例,类的具体对象.方法:          类中定义的函数. (方法和函数在

《易学Python》——第6章 类与面向对象编程 6.1 类是什么

第6章 类与面向对象编程 本章介绍如下内容: 一种看待类的更简单方式: 如何使用类来设计程序. 在本书前面,始终未涉及Python中组织程序的基本方式之一:类.类和面向对象编程通常被认为是一个庞大而吓人的主题,仅供真正的程序员用来编写程序,因此您可能认为,要正确地使用它们,需要大量的理论知识.没有比这种看法更离谱的了.在Python中,使用类和面向编程易如反掌. 在本章中,您将首先复习第2章为游戏Hunt the Wumpus编写的洞穴生成代码,并了解到使用类编写这些代码容易得多:然后,您将以此