Lua中面向对象编程的理解

模块

模块是一个独立的空间,一个独立的环境,访问模块成员需要先require,并使用“模块名.成员名称”的格式访问。注意:模块是一个table。

在lua中所有对象都是一个table,类也是一个table,但类应该是一个只读的table,类的定义是通过创建一个模块实现的。

lua代码:

module("Student",package.seeall)

function study(self)

end

在调用module方法时添加package.seeall参数的作用是:让该模块可以访问全局变量。

对象

对象是一个类的实例,在Lua中对象是一个table,在Lua中类更像是一个原型(一个只读的对象)。

通过设置tableA的元表的__index字段为tableB,当读tableA中没有的字段时就会从tableB中读该字段。

可以先创建一个空table,然后通过设置元表的方式,创建一个对象,当访问该对象没有的字段时就会在类中寻找。

lua代码:

-- 创建对象方法
function new( moduleName )
	local obj = {}
	setmetatable(obj,{__index = moduleName})
	return obj
end

继承

在Lua中继承也可以通过设置元表的方式实现。

lua代码:

-- 继承
function extend( child, parent )
    setmetatable(child,{__index = parent})
end

静态与非静态

静态成员与非静态成员的区别就在于:是否可以通过类名访问,如果可以通过类名访问则是公有静态成员,否则是非公有静态成员或非静态成员。而在Lua中类名就是模块名称,如果可以“模块名.成员名”形式访问则是公有静态成员。

lua代码:

module("Student",package.seeall)

-- 公有静态成员变量(可通过模块名访问)
flag = 1
-- 私有静态成员变量(外部不可访问)
local flag2 = 2

-- 非静态成员方法(需要传self)
function init(self, name)
    -- 非静态成员变量
	self.name = name
end

-- 静态成员方法(不需要传self)
function getFlag()
	return flag
end

-- 非静态成员方法
function getName(self)
	return self.name
end

tools.lua

-- 创建一个对象并初始化
function create( moduleName, ... )
	local obj = new(moduleName)
	obj:init( ... )
	return obj
end

调用代码:

    require "utils/tools"
    require "Student"

    -- 访问公有静态成员变量
    cclog("flag = %d",Student.flag)
    -- 访问静态方法
    cclog("flag = %d",Student.getFlag())
    -- 创建一个Student对象
    local obj = create(Student,"xiaoming")
    -- 通过对象访问公有静态成员变量
    cclog("falg = %d",obj.flag)
    -- 访问非静态成员变量
    cclog("name = %s",obj.name)
    -- 访问非静态成员方法
    cclog("name = %s",obj:getName())

打印结果:

1.静态成员变量与非静态成员变量的区别在于:该变量是存在模块的环境中,还是存在self中。

2.静态成员方法与非静态成员方法的区别在于:该方法是否需要传self。

3.访问静态成员与非静态成员

访问模块中的成员都可以通过“模块名.成员名称”的方式访问,但访问模块中非静态成员方法时,通过“self:成员名称()”的方式会更方便(注意:":"只是为了语法便利,作用只是把self作为方法的第一个实参,与“模块名称.(self)”没什么区别)。

注意:在Lua中本来并没有静态与非静态这个概念。

时间: 2024-10-10 04:16:48

Lua中面向对象编程的理解的相关文章

Lua 之面向对象编程

Lua 之面向对象编程 Lua并不是为面向对象而设计的一种语言,因此,仅从原生态语法上并不直接支持面向对象编程,但Lua的设计中仍然包含了很多面向对象的思想,理解它们也更有助于理解Lua自身的一些高级机制. 对象 Lua中的table就是一种对象,它可以有函数字段.在面向对象(Object Oriented)编程中,对象的方法(method)通常使用self(或this)参数标识对象自身,在Lua中也可以使用冒号(:)实现类似的功能,如下面的例子: Account = {balance=0} f

C#中面向对象编程机制之多态学习笔记

C#的多态性: 我的理解是:同一个操作,作用于不同的对象时,会有不同的结果,即同一个方法根据需要,作用于不同的对象时,会有不同的实现. C#的多态包括:接口多态,继承多态. 其中继承多态又包括通过虚拟方法实现的多态和通过抽象方法实现的多态性 例如:基类动物都有吃的方法,但是不同的动物吃的东西就会不一样,例如狼吃肉,羊吃草,这样"吃"的这个方法就要在派生类里面重新实现以下,运行时,通过指向基类的指针,来调用实现派生类中的方法. 接下来举例实现多态性. 1. 接口多态性 把动物"

C#中面向对象编程机制之继承学习笔记

继承反应了类和类之间的关系. 世界上很多事物都是有共性的,共性的那一部分我们就抽象为基类,用于派生其它类,这样提高了代码的复用性,使得代码的结构清晰易读,而且易于代码的扩展和维护. C#的继承只能继承自一个基类,这一点不同于C++的继承. C#的继承具有传递性,即B继承自A,C继承自B,则C具有A的所有特性. C#的继承隐式为public的. 假如不在派生类构造器中显示调用一个基类构造器,编译器会自动插入对基类的默认构造器的一个调用,然后才会执行派生类构造器中的代码, 如果基类没有默认的构造器,

关于java中面向对象编程的一点点小感悟!!!

断断续续接触java已经有半年的时间,当然中间也有过很多事情,不得已而中断了java的学习.当初刚刚接触到java的时候,总是不能理解java的面向对象编程优点.平常生活中我们做事情的思维方式都是面向过程的,就拿最简单的我要上一个培训班来说: 第一步:当然得是网上.贴吧.朋友的口中来了解这个辅导班,以此来决定是否需要上这个辅导班. 第二步:当然就是当了解完成之后,对这个辅导班比较满意.自己就需要做准备来达到辅导班的要求,比如说学费.复习知识,准备参加辅导班规定的考试. 第三步:当然就是付诸实践,

lua的面向对象编程

首先我们去了解一下类,一个类就是一个创建对象的模具,实际上,lua中不存在类这个概念,我们都是去模拟类.在lua中,要表示一个类,只需创建一个专用作其它对象的原型.我们在lua的面相对象,就是使用table,元表以及元方法,我们现在看一下具体事怎么做的: 我们现在有两个对象a和b,现在想b作为a的原型,只需编写下面代码即可: setmetatable(a,{__index = b}) 我们前面有讲过__index,编写完这段代码之后,当lua执行了a没有的操作的时候,就会去b中查询.实际上我们也

Lua学习----面向对象编程

1.类 再Lua中可以使用表和函数实现面向对象,将函数和相关的数据放置放置于同一个表中就形成了对象.例如: Measure = {width = 0, height = 0} function Measure:setWifth(v) self.width = self.width + v end function Measure:setHeight(v) self.height = self.height + v end function Measure:getMeasure() print(s

【Lua】面向对象编程(一)

类和对象: account.lua   module(...,package.seeall) Account={balance=0} Account.new=function(self,o) local o=o or {} setmetatable(o,self) self.__index=self return o end Account.getBalance=function(self) return self.balance end Account.setBalance=function(

js中面向对象编程

一.理解对象: 第一种:基于Object对象 var person = new Object(); person.name = 'My Name'; person.age = 18; person.getName = function(){ return this.name; } 第二种:对象字面量方式(比较清楚的查找对象包含的属性及方法) var person = { name : 'My name', age : 18, getName : function(){ return this.n

python 中面向对象编程简单总结3--定制类

声明:资源来自慕课网python学习课程,以下只是个人学习总结,仅供参考 1.Python类的特殊方法 特征:以  __ 开头并结尾的方法,比如用于print的__str__() , __getattr__(),__setattr__()等   不需要在代码中直接调用, Python的某些函数和操作符会自动调用. 可以自己定制实现,如__str__()方法 class Person(object): def __init__(self,name,gender): self.name = name