浅谈Lua的面向对象特性
面向对象的特性
- 类:类是可扩展的模板用来创建对象,提供状态的初始值(成员变量)和行为的实现。
- 对象:它是类的实例并具有分配给自己独立的内存。
- 继承:它是由变量和类的函数被其他类继承的概念。
- 封装:它是将数据和函数相结合的一类内的方法。数据可以在类的外部与函数的帮助下进行访问。它也被称为数据抽象。
Lua的OOP
在Lua中实现面向对象与表和Lua的第一类函数。通过将函数和相关数据插入表中形成一个对象。继承可以在metatables的帮助下来实现,提供了一个查找机制不存在的函数(方法)和在父对象字段。
在Lua表有这样的状态和标识对象,它是独立于值的特性。两个对象(表),具有相同的值但在不同的对象,而一个对象可以具有在不同的值,但它始终是相同的对象。就像对象表中有一个生命周期,独立创建或被创建。
一个真实世界的例子
面向对象的概念是广泛的,但要明白和获取最大利益。
让我们考虑一个简单的数学例子。我们经常会遇到,我们工作在不同的形状像圆形,长方形和正方形的情况。
形状可以有一个共同的属性区。因此,我们可以从与共同属性区域的基础对象形状扩展的其它形状。每个形状都可以有其自己的性质和功能类似的矩形可以有属性的长度,宽度,面积作为其属性,printArea中和calculateArea作为它的函数。
创建一个简单的类
一个简单的类实现矩形三个属性面积,长度和宽度如下所示。它也有一个printArea中功能打印所计算的面积。
--Metaclass Rectangle={area=0,length=0,breadth=0}
--Derivedclassmethodnew functionRectangle:new(o,length,breadth) o=oor{} setmetatable(o,self) self.__index=self self.length=lengthor0 self.breadth=breadthor0 self.area=length*breadth; returno end
--DerivedclassmethodprintArea functionRectangle:printArea() print("TheareaofRectangleis",self.area) end