虽然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面相对象的知识
希望我所写的对大家有帮助 如果有问题可以联系我
主页有我的联系方式