当前位置: 首页 > news >正文

lua面向对象

1. self,也就是C++语言的this指针


local Account = {
	balance = 0
}

function Account.add(this, v)
	this.balance = this.balance + v
end

function Account:sub(v)
	self.balance = self.balance - v
end
--[[
当我们用.去调用一个函数的时候
需要显示的把对象自己传递过去
]]
Account.add(Account, 20)
print(Account.balance)	--20

Account:add(30)
print(Account.balance)	--50

Account.sub(Account, 10)
print(Account.balance)	--40
--[[
使用:调用一个函数的时候 lua会隐式传递this指针
我们在函数里面用self可以访问到
]]
Account:sub(40)
print(Account.balance)	--0

2.lua的面向对象的实现

参考一下C++中类的实现,所有类的对象共享类的方法,但是他们的数据是有差异的,他们的数据是通过this指针去获取,然后调用相同的方法,来对数据进行操作的
既然方法都是相同的,只是this指针有差异的话,那么就定义一个表,实现该类的所有方法,让该表成为对象的元表,即可实现
(可以看看我上一篇lua的元表和元方法)

local Account = {
	balance = 0
}


function Account.new(o)
	o = o or {}
	setmetatable(o, {__index = Account})
	return o
end


function Account.add(this, v)
	this.balance = this.balance + v
end

function Account:sub(v)
	self.balance = self.balance - v
end


local acc1 = Account.new({balance = 100})

acc1:add(200)
print(acc1.balance)

3.继承操作


local Account = {
	balance = 0
}

--此时的self就是Account这个表
function Account:new(o)
	o = o or {}
	self.__index = self
	setmetatable(o, self)
	return o
end


function Account:add(v)
	self.balance = self.balance + v
end

--Account类不支持账户的透支操作
function Account:sub(v)
	if self.balance < v then
		print("no enough money")
		return false
	end
	self.balance = self.balance - v

	return true
end

--从Account类中继承了所有的操作函数
SpecialAccount = Account:new()

--self指的是SpecialAccount 但是他里面没有new这个方法
local s = SpecialAccount:new({balance = 100})

s:add(200)
print(s.balance)	--300


s:sub(400)	--no enough money

function SpecialAccount:sub(v)
	if self.balance < v then
		print("no enough money but can sub")
	end
	self.balance = self.balance - v

	return true
end
--sub函数被子类重写
s:sub(400)--no enough money but can sub

4.闭包实现private

local Account = {}

function Account.new(balance)
    local self = {}  -- 公共接口
    local _balance = balance  -- 私有变量,外部无法访问

    function self:getBalance()
        return _balance
    end

    function self:deposit(amount)
        _balance = _balance + amount
    end

    function self:withdraw(amount)
        if _balance >= amount then
            _balance = _balance - amount
            return true
        else
            return false
        end
    end

    return self
end

local acc = Account.new(100)
print(acc:getBalance())  -- 100
acc:deposit(50)
print(acc:getBalance())  -- 150
print(acc._balance)  -- nil(无法访问)

相关文章:

  • Couchbase存储引擎Magma和Couchstore
  • 鸿蒙开发之ArkTS联合类型
  • Kafka 4.0 发布:KRaft 替代 Zookeeper、新一代重平衡协议、点对点消息模型、移除旧协议 API
  • Java排序
  • 输出文字的综合使用例子
  • 本地部署仓库管理工具 Gitlab 并实现外部访问
  • 从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.2.2文本生成逻辑:Top-k采样与温度控制
  • 级联FFT(超采样FFT架构)的MATLAB代码及原理
  • 前端技巧第十期JavaScript作用域链
  • 【银河麒麟系统常识】命令:dotnet --list-sdks(列出已安装的 .NET SDK 版本)
  • matlab打开两个工程
  • Redis 基础篇笔记
  • Android系统Launcher启动流程学习(三)Launcher启动流程
  • Windows 10 ARM64平台MFC串口程序开发
  • 前端知识点---事件委托和机制-阻止冒泡机制-阻止默认行为机制(javascript)
  • JavaScript描述Object.create()方法的原理及作用,如何利用它创建一个具有指定原型的对象?
  • java: 无法访问org.springframework.web.bind.annotation.GetMapping
  • 正则表达式-笔记
  • Transformer的理解
  • 7.2 分治-快排:LeetCode 912. 排序数组
  • 国外学校网站模板/今日重大事件
  • 静态网站如何做自适应移动端/seo和sem哪个工资高
  • 江西软件职业技术大学/百度关键词优化送网站
  • 女性做网站/加盟教育培训哪个好
  • 旅游网站组织结构图怎么做/设计网站排名
  • 产品经理兼职做网站报酬/自己如何做链接推广