Cat={age=2,color="red"} --封装
local this =Catfunction Cat:new(o)
local t= o or {}
setmetatable( t, {__index=self})
return t
end
function Cat:Say()
print(self.age.."岁的"..self.color.."的猫:".."喵~~")
end
redCat=Cat:new()
BlueCat=Cat:new({name="tom",color="blue"})function BlueCat:Say()
print( "子对象的重写方法" )
end
blueCat=BlueCat:new({age=13})
blueCat:Say()
redCat:Say()
一般用大写字母开头来表示一个原型,
面向对象特征
- 1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
- 2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。
- 3) 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
- 4)抽象:抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。
Lua面向对象中, 没有直接的类,可以用表来实现 面向对象,函数/方法 通过: 来声明,系统会自动传递当前的table给self,而通过.声明不会;
访问属性
访问 属性 通过 (.)来访问
访问成员函数
我们可以使用冒号 : 来访问类的成员函数:
可以利用 元表 来模拟 继承,派生类 可以保留继承类的成员变量和方法
元表 setmetatable(table,metatable)
function Cat:new(o)
local t= o or {}
setmetatable( t, {__index=self})
return t
end
self 表示 原型类的table, o 是传进来的对象,也就是要继承原型类的对象。通过元表,继续原型类的对象在访问和修改属性时,不会影响原型类的数据。调用,声明时,会从原型类table里查找,有就会作为参数传给函数,没有就返回nil,这个时候,继承原型类的对象就会在他自身的表 (t) 里 增添多属性。
lua查找机制
当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
如果__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数。
__index 元方法查看表中元素是否存在,如果不存在,返回结果为 nil;如果存在则由 __index 返回结果。
Lua查找一个表元素时的规则,其实就是如下3个步骤:
- 1.在表中查找,如果找到,返回该元素,找不到则继续
- 2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
- 3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值。
通过metetable 可以实现 别的对象 继承这个原型时不 影响 原型中的数据;
函数重写
可以直接
function BlueCat:Say()
print( "子对象的重写方法" )
end
至于多态,只需要在复制粘贴,在重写的方法里 增加多属性,并没有c#或者 java方便