lua面向对象

发布于:2025-03-27 ⋅ 阅读:(32) ⋅ 点赞:(0)

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(无法访问)


网站公告

今日签到

点亮在社区的每一天
去签到