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

   这篇文章主要介绍了Lua面向对象之类和继承浅析,本文讲解了一些Lua面向对象的一些知识,需要的朋友可以参考下

  Lua中的table就是一种对象,但是如果直接使用仍然会存在大量的问题,如下:

  代码如下:

  Account = {balance = 0}

  function Account.withdraw(v)

  Account.balance = Account.balance - v

  end

  --下面是测试调用函数

  Account.withdraw(100.00)

  在上面的withdraw函数内部依赖全局变量Account,一旦发生改变,将会导致withdraw不能正常工作,如:

  代码如下:

  a = Account; Account = nil

  a.withdraw(100.00) --将会导致访问空nil的错误。

  这种行为明显违反了面向对象封装性和实例独立性。要解决这一问题,我们需要给withdraw函数再添加一个参数self,他等价于java/C++中的this,如下:

  代码如下:

  function Account.withdraw(self,v)

  self.balance = self.balance - v

  end

  --下面是基于修改后代码的调用:

  a1 = Account; Account = nil

  a1.withdraw(a1,100.00) --正常工作。

  针对上述问题,lua提供了一种更为便利的语法,即将点(.)替换为冒号(:),这样可以在定义和调用函数时隐藏参数。如:

  代码如下:

  function Account:withdraw(v)

  self.balance = self.balance - v

  end

  --调用代码可改为:

  a:withdraw(100.00)

  1、类:

  lua中再语言上并没有提供面向对象的支持,因此想实现该功能,我们只能通过table来模拟,如下:

  代码如下:

  --这里的lovenumber是一个公有成员变量

  Father={ lovenumber=0}

  --new可以视为构造函数

  function Father:new(p)

  p=p or {} --如果参数中没有提供table,则创建一个空table

  --将新对象实例的元表指向Father,这样就可以以Father为模板了

  setmetatable(p,self)

  --将Father的__index字段指向自己,以便新对象在找不到指定的key时可以被重定向,即访问Father拥有的key

  self.__index=self

  return p

  end

  function Father:toString()

  print("I love my son!")

  end

  --Loving被视为公有成员函数

  function Father:Loving(v)

  self.lovenumber=self.lovenumber+v --这里的self表示实例对象本身

  return self.lovenumber

  end

  f1=Father:new{name="jianjian"}

  f2=Father:new{name="baba",}

  print(f1:Loving(100))

  print(f2:Loving(200))

  --输出答案

  --100

  --200

  2、继承

  继承也是面向对象中一个非常重要的概念,在lua中我们也可以像模拟类那样来实现继承机制。

  代码如下:

  Father={ lovenumber=0}

  function Father:new(p)

  p=p or {}

  --将新对象实例的元表指向Father,这样就可以以Father为模板了

  setmetatable(p,self)

  --将Father的__index字段指向自己,以便新对象在找不到指定的key时可以被重定向,即访问Father拥有的key

  self.__index=self

  return p

  end

  function Father:toString()

  print("I love my son!")

  end

  function Father:Loving(v)

  self.lovenumber=self.lovenumber+v

  return self.lovenumber

  end

  --下面派生出Father的一个子类,此时的Son仍为Father的一个对象实例

  Son=Father:new()

  --重写Father中的toString方法,以实现自定义功能

  function Son:toString()

  print("I love myself!")

  end

  --在执行下面的new方法时,table s的元表已经是Son了,而不是Father

  s=Son:new()

  print(s:toString()) --先在子类Son中找到该方法

  print(s:Loving(50)) --子类中无该方法,则调用父类中该方法

  --输出答案

  --I love myself!

  --50

时间: 2024-10-17 01:32:41

Lua面向对象之类和继承浅析的相关文章

Lua面向对象之类和继承_Lua

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

Lua面向对象设计(转)

首先对于Lua语言,它没有打算被用来进行大型的程序设计,相反,Lua目标定于小型到中型的程序设计,通常是作为大型系统的一部分,所以它只提供了一套精简的元素,很多高级语言的概念都没有.这样Lua就成为了一个既简单又灵活的轻量级语言,但是基本上高级语言中的大多数机制都可以在现有Lua的基础上加以实现. 面向对象的基础是类,但Lua中没有提供类的概念,所以我们需要利用Lua现有的机制来实现类似于类的有关oop的一整套概念.基本方案是使用table来实现类机制,并且结合使用self参数和冒号操作.我们先

Lua面向对象之多重继承、私密性详解_Lua

在Lua中的多重继承和私密性可能用得比较少,也可能只是我个人用得比较少. 本来想偷懒不写这文章的,因为我今天刚买了个漂移板,连起步都还没学会啊,想多学一会. 咳咳,本着坚持不懈.负责到底的态度,我还是决定随便写几句~(小若:随便写几句是几吨意思啊?!) 1.多重继承之在多个类中查找一个字段 我发现这些高(shen)智(jing)商(bing)人群真的很厉害,这种技巧都能想到,很佩服. 其实多重继承没什么特别的,除非两个将要被继承的类有相同的函数名和属性,否则,处理起来很简单.   无非就是在多个

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

Lua中的table就是一种对象,即它拥有状态.拥有独立于其值的标识(self).table与对象一样具有独立于创建者和创建地的征集周期 什么叫对象拥有独立的生命周期? Account = {balance = 0} function Account.withdraw(v) Account.balance = Acount.balance-v end --则可进行如下调用 Account.withdraw(v) --[[在函数中使用全局名称Account不是个了习惯 因为这个函数只能针对特定对象

PHP面向对象中类的继承的使用

PHP类的继承在PHP语言的学习中是一个比较重要的知识点.那么我们该如何正确的学习PHP类的继承呢?在PHP面向对象编程里,类的继承永远是最关键的. 这就像人类生儿育女一样(为什么一定要生儿育女呢,难道就是为了防老!不得而知呀),你把自己的一些基因和你老婆的基因各拿出来一些,再生成一个新的个体,这个新的个性一定会包含你们两个人身上的特征,这就是生物上关于遗传(继承)的一个解说.在编程的世界是这个遗传就是继承! 首先在了解了继承的一些活生生的原理后,我想再来看PHP类的继承是不是不再那么神秘.或许

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 是以全局变量的

关于面向对象中,继承、多态问题。

问题描述 最近在学java基础,学完面向对象感觉自己很不理解继承和多态,不知道该怎么用,谁能给我讲下啊,很困惑的说. 解决方案 解决方案二:感觉java编程思想在这一块说的是非常的好.解决方案三:不理解可以先放一放多敲敲代码月往后就会越懂得现在先积累代码量不要一味的抄代码解决方案四:了解---->敲代码----->理解解决方案五:继承就是扩展或派生基类,你可以这样理解:子类内部持有父类的引用,有共同的行为和属性(private,构造器除外),你可以对重写父类的方法来达到多态的目的.而多态就是,

Lua实现类与继承的实例详解

Lua中没有类的概念,但可以通过table.函数以及一些语言特性来模拟类.table的值可以为函数.看下面这段代码: LogUtil = {msg_prefix = string.format("%s ", os.date("%H:%M:%S", os.time())) } LogUtil.write = function(msg)     print(LogUtil.msg_prefix .. msg .. "\r\n") end   LogU

javascript 面向对象封装与继承_javascript技巧

整理一下js面向对象中的封装和继承. 1.封装 js中封装有很多种实现方式,这里列出常用的几种. 1.1 原始模式生成对象 直接将我们的成员写入对象中,用函数返回. 缺点:很难看出是一个模式出来的实例. 代码: 复制代码 代码如下:        function Stu(name, score) {             return {                 name: name,                 score: score             }