面向对象特征
1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。
3) 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
4)抽象:抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。
Lua 中面向对象
我们知道,对象由属性和方法组成。LUA中最基本的结构是table,所以需要用table来描述对象的属性。
lua中的function可以用来表示方法。那么LUA中的类可以通过table + function模拟出来。
至于继承,可以通过metetable模拟出来(不推荐用,只模拟最基本的对象大部分时间够用了)。
Lua中的表不仅在某种意义上是一种对象。像对象一样,表也有状态(成员变量);也有与对象的值独立的本性,特别是拥有两个不同值的对象(table)代表两个不同的对象;一个对象在不同的时候也可以有不同的值,但他始终是一个对象;与对象类似,表的生命周期与其由什么创建、在哪创建没有关系。
简单的实例
person={name="lian",age=22}
-- function person.eat(self)
-- print(self.name.."正在吃饭")
-- end
function person:eat()
print(self.name.."正在吃饭")
end
--[[
function person:eat()
print(self.name.."正在吃饭")
end
]]--
-- a=person
-- person=nil
--当通过:调用的时候,系统会自动传递当前table给self
--当通过.来调用方法的时候,self不会自动赋值,
--我们必须通过第一个参数来传递当前的table
-- a.eat(a)
-- a:eat()
function person:new(o)
--如果o is nuil 也就是false就会返回{}
local t=o or{}
--调用一个属性的时候,如果t中不存在,那么会在--index所指定的table中查找
--setmetatable(t,{__index=self})
setmetatable(t,self)
self.__index=self
return t
end
person1=person:new({weight=100})
person1.name="persion1"
print(person1.name)
print(person1.weight)
person2=person:new()
person2.name="persion2"
print(person2.name)
print(person.name)
输出结果
persion1
100
persion2
lian
面向对象继承
Student=person:new()
Student.grad=1
stu1=Student:new()
stu1:eat()
print(stu1.grad)
输出
lian正在吃饭
1