lua面向对象

虽然lua没有直接支持面相对象
通过table可以间接实现面向对象

1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。
3) 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
4)抽象:抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。

我们知道,对象由属性和方法构成,lua最最基本的结构是table 所以我们就是使用table来实现对象的属性
lua中的function可以用来表示方法 所以lua中的类可以通过table+function模拟出来
至于继承我们可以使用模块(metatable)来模拟出来
lua中的表不仅仅在某种意义上是一种对象,像对象一样,表也有状态,已有与对象的值的本性

最最简单的lua实现面向对象

person={name="头号理想",age=99}

person.eat=function ()

	print(person.name.."吃饭")
end

person.eat();

function person.drink()
	print(person.name.."在喝水")
end
person.drink()

person2={name="老八",age=23,run = function ()
	print(person2.name.."在去厕所的路上")
end
}
person2.run()

上边是三种实现简单对象的方法
运行结果如下
在这里插入图片描述
但是这样实现之后还是有缺点的 比如每次想要实例出一个新对象不能new 出来 只能重复上边的操作

在我们使用自己创建的方法的时候 我们可以使用self关键字
但是我们只有通过冒号(:)来调用的时候自动才能给self赋值
否则只能使用(.)来给self手动赋值


--人
person={name="头号理想",age=99}

person.eat=function (self)

	print(self.name.."吃饭")
end



function person:drink()
	print(self.name.."在喝水")
end
person:drink()
--当通过:调用的时候 系统自动传递table给self 当通过.传递的时候self需手动传递参数

在这里插入图片描述
之后我们综合之前学过的知识 我们实现一下面向对象的很方便的实例的功能
里边要用到之前元表的知识 如果大家有不清楚的地方可以去我之前的博客查看

--构造方法
--原型
person={name="老八",age=34}
function person:eat()
	print(self.name.."在吃饭")
	print(self.name.."的年龄是"..self.age)

end

function person:new()
	t={}

	setmetatable(t,{__index=self})--如果不存在就会在元表中查找

	return t

end

person1=person:new()
person1.name="头号理想"
person1.age=43
person1:eat()




person2=person:new()
print(person2.name)

上边我直接给出代码 里边使用了元表中的__index的知识
在这里插入图片描述
可以看到我们很方便的可以实例化出来一个新的“对象”(实质上就是一个表)
我们也可以使用冒号 来很方便的调用原型中的方法

同样的和java和c#一样我们也可以创造具有构造函数的构造方法
这里又要使用一个关键字or

function person:new(o)



	t=o or {}--如果o为空则返回{} 否则返回o

	setmetatable(t,{__index=self})--如果不存在就会在元表中查找

	return t

end


person2=person:new({weight=999})
print(person2.name)
print("体重为"..person2.weight)


代码是上边代码的扩展
这里我传入一个体重的参数可以看到我们可以直接使用

接下来就是继承了


--构造方法
--原型
person={name="老八",age=34}
function person:eat()
	print(self.name.."在吃饭")
	print(self.name.."的年龄是"..self.age)

end

function person:new(o)



	local t=o or {}--如果o为空则返回{} 否则返回o

	setmetatable(t,{__index=self})--如果不存在就会在元表中查找

	return t

end

person1=person:new(nil)
person1.name="头号理想"
person1.age=43
person1:eat()


person2=person:new({weight=999})
print(person2.name)
print("体重为"..person2.weight)


student =person:new()
student.grade=1

stu1=student:new()
stu1:eat()

student类就是继承的person类 从而可以使用上边的所有的方法

上边基本就是所有的关于lua面相对象的知识
希望我所写的对大家有帮助 如果有问题可以联系我
主页有我的联系方式

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值