加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Lua的面向对象实现

发布时间:2020-12-14 22:07:48 所属栏目:大数据 来源:网络整理
导读:【不知道为什么,lua没有语法高亮提示】 我的前提条件: 1.Linux下已安装lua5.2 2.已安装sublimetext,并配置好lua的编译。 配置如下: 依次找到:Tools - Build System - New Build System {????"cmd":?????["/usr/bin/lua5.2","$file"],?????"file_regex":

【不知道为什么,lua没有语法高亮提示】

我的前提条件:

1.Linux下已安装lua5.2

2.已安装sublimetext,并配置好lua的编译。

配置如下:

依次找到:Tools -> Build System -> New Build System

{???
?"cmd":????
?["/usr/bin/lua5.2","$file"],????
?"file_regex":"^(?:lua:)?[t](...*?):([0-9]*):?([0-9]*)",????
????"selector":????
????"source.lua"????
}

?? 其中

"/usr/bin/lua5.2"?是lua编译器的路径。

可以换成"lua",前提是已经配置好lua的环境。

并在Tools -> Build System 下选中 lua。

以后编译的时候,直接按ctrl+B 就ok了。


1.复制的方式

我们知道lua中非常重要的一个结构是表,那么我们的面向对象也应该是由表来实现。

既然是复制的方式,那么肯定会有复制的函数:

function?clone(tab)
????--?body
????local?self?=?{}

????for?k,v?in?pairs(tab)?do
????????self[k]?=?v
????end

????return?self
end

这个函数的功能就是将tab中的内容复制到self中,并返回。

首先我们定义一个类,叫做Man

Man?=?{}

Man.sayHi?=?function()
????print("hi...")
end


local?m?=?clone(Man)
m.sayHi()

这样,结合clone函数,我们的local m就可以看作是Man的实例,调用sayHi方法就可以执行了,ctrl+B执行一下。

紧接着我们来写一个有参赛的成员函数:

Man.talk?=?function?(ins)
????print("i?said?"..ins.content)
end

参数 ins 我们可以认为是一个类的实例,那么我们需要一个构造方法来传入初始的内容,这样做:

Man.new?=?function(content)
????--?body
????local?self?=?clone(Man)
????self.content?=?content
????return?self
end

这样,在调用Man.new()函数的时候,就附加了content属性。

因此我们的调用就成了:

local?man?=?Man.new("eat?it?!")
man:talk()

注意:man:talk() 跟 man.talk(man)是一个意思。使用 : 会默认将man这个实例当作第一个参数传递进去。

再运行一下,会输出 i said eat it !

面向对象肯定会有继承,那么既然是复制的方式,那就会有一个复制方法,将2个类合成一个。

既子类拥有自己的特有属性,也有父类的属性。

function?copy(to,from)
????--?body
????for?k,v?in?pairs(from)?do
????????to[k]?=?v
????end
end

将from里的东西都复制到to里面去,很简单。

那么接下来定义子类:

Boy?=?{}

Boy.new?=?function(content)
????--?body
????local?man?=?Man.new(content)
????copy(man,Boy)
????man.name?=?"jobs"
????return?man
end

Boy.sayName?=?function?(self)
????--?body
????print("my?name?is?"..self.name)
end

在这里继承了Man并且附加了name属性。测试:

local?b?=?Boy.new("hehe?...")
b:sayHi()
b:sayName()
b:talk()

会输出:

hi...
my name is jobs
i said hehe ...

假如要重写函数:

Boy.sayHi?=?function?()
????print("Boy?say?hi?...?"?)
end

那么就会输出: Boy say hi ...


2.函数闭包方式

这里的函数闭包,简单来说,就是一个函数的声明和实现,在另一个函数之内。

现在来实现一个类:

function?People(name)
????--?body
????local?self?=?{}

????function?init()
????????self.name?=?name
????end

????self.talk?=?function()
????????print("people?talk?"..self.name)
????end


????init()
????return?self
end

local?p?=?People("steven")
p.talk()

那么,输出就是 people talk steven

现在来实现一个子类:

function?Man(name)
????
????local?self?=?People(name)

????self.talk?=?function()
????????print("man?talk?"?..?self.name)
????end

????self.eat?=?function()
????????print("eating?...?")
????end

????return?self
end

local?m?=?Man("jack")
m:talk()
m:eat()

在Man中,talk复写了父类的方法,那么将会输出:

man talk jack

eating ...

函数闭包的方式要比复制的方式消耗资源大一些,但是就现在来说,微不足道。

推荐使用函数闭包的方式来编写程序。

暂时到此。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读