Lua OOP面向对象

版权声明:转载 请说明 https://blog.csdn.net/qq2512667/article/details/83687694

Cat={age=2,color="red"} --封装
local  this =Cat 

function 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方便

猜你喜欢

转载自blog.csdn.net/qq2512667/article/details/83687694