您现在的位置: 万盛学电脑网 >> 程序编程 >> 网络编程 >> 编程语言综合 >> 正文

浅谈Lua的面向对象特性

作者:佚名    责任编辑:admin    更新时间:2022-06-22

   这篇文章主要介绍了Lua的面向对象特性,包括对象和继承等传统OOP概念的几个关键知识点,需要的朋友可以参考下

  面向对象的特性

  类: 类是可扩展的模板用来创建对象,提供状态的初始值(成员变量)和行为的实现。

  对象: 它是类的实例并具有分配给自己独立的内存。

  继承: 它是由变量和类的函数被其他类继承的概念。

  封装: 它是将数据和函数相结合的一类内的方法。数据可以在类的外部与函数的帮助下进行访问。它也被称为数据抽象。

  Lua的OOP

  在Lua中实现面向对象与表和Lua的第一类函数。通过将函数和相关数据插入表中形成一个对象。继承可以在metatables的帮助下来实现,提供了一个查找机制不存在的函数(方法)和在父对象字段。

  在Lua表有这样的状态和标识对象,它是独立于值的特性。两个对象(表),具有相同的值但在不同的对象,而一个对象可以具有在不同的值,但它始终是相同的对象。就像对象表中有一个生命周期,独立创建或被创建。

  一个真实世界的例子

  面向对象的概念是广泛的,但要明白和获取最大利益。

  让我们考虑一个简单的数学例子。我们经常会遇到,我们工作在不同的形状像圆形,长方形和正方形的情况。

  形状可以有一个共同的属性区。因此,我们可以从与共同属性区域的基础对象形状扩展的其它形状。每个形状都可以有其自己的性质和功能类似的矩形可以有属性的长度,宽度,面积作为其属性,printArea中和calculateArea作为它的函数。

  创建一个简单的类

  一个简单的类实现矩形三个属性面积,长度和宽度如下所示。它也有一个printArea中功能打印所计算的面积。

  代码如下:

  -- Meta class

  Rectangle = {area = 0, length = 0, breadth = 0}

  -- Derived class method new

  function Rectangle:new (o,length,breadth)

  o = o or {}

  setmetatable(o, self)

  self.__index = self

  self.length = length or 0

  self.breadth = breadth or 0

  self.area = length*breadth;

  return o

  end

  -- Derived class method printArea

  function Rectangle:printArea ()

  print("The area of Rectangle is ",self.area)

  end

  创建对象

  创建对象是类的实例分配存储器的过程。每个对象具有它自己的存储器和共享公用类数据。

  复制代码 代码如下:

  r = Rectangle:new(nil,10,20)

  访问属性

  在类中用点 . 操作符,如下图所示,可以访问属性

  代码如下:

  print(r.length)

  访问成员函数

  使用冒号运算符,如下图所示,可以访问对象成员函数。

  代码如下:

  r:printArea()

  存储器被分配和初始值被设定。初始化过程可以比在其它面向对象的语言构造。它只是一项功能设定值,如上图所示。

  完整例子

  让我们来看看使用面向对象的Lua中一个完整的例子。

  代码如下:

  -- Meta class

  Shape = {area = 0}

  -- Base class method new

  function Shape:new (o,side)

  o = o or {}

  setmetatable(o, self)

  self.__index = self

  side = side or 0

  self.area = side*side;

  return o

  end

  -- Base class method printArea

  function Shape:printArea ()

  print("The area is ",self.area)

  end

  -- Creating an object

  myshape = Shape:new(nil,10)

  myshape:printArea()

  当运行上面的程序,会得到如下的输出。

  代码如下:

  The area is 100

  Lua的继承

  继承是扩展形状简单的基本对象,以矩形,正方形等的处理。它通常用于在真实世界中的共享和扩展的基本性质和功能。

  让我们看一个简单的类扩展。有一个类,如下图所示。

  代码如下:

  -- Meta class

  Shape = {area = 0}

  -- Base class method new

  function Shape:new (o,side)

  o = o or {}

  setmetatable(o, self)

  self.__index = self

  side = side or 0

  self.area = side*side;

  return o

  end

  -- Base class method printArea

  function Shape:printArea ()

  print("The area is ",self.area)

  end

  我们可以扩展的形状为正方形类如下所示。

   代码如下:

  Square = Shape:new()

  -- Derived class method new

  function Square:new (o,side)

  o = o or Shape:new(o,side)

  setmetatable(o, self)

  self.__index = self

  return o

  end

  重载基础函数

  我们可以重载基类函数使用基类中的函数,而不是派生类它自己再实现,如下图所示

  代码如下:

  -- Derived class method printArea

  function Square:printArea ()

  print("The area of square is ",self.area)

  end

  继承完整的例子

  Lua中我们可以扩展的简单类实现,如上图所示metatables另一个新的方法。所有的成员变量和基类的函数被保留在派生类。

  代码如下:

  -- Meta class

  Shape = {area = 0}

  -- Base class method new

  function Shape:new (o,side)

  o = o or {}

  setmetatable(o, self)

  self.__index = self

  side = side or 0

  self.area = side*side;

  return o

  end

  -- Base class method printArea

  function Shape:printArea ()

  print("The area is ",self.area)

  end

  -- Creating an object

  myshape = Shape:new(nil,10)

  myshape:printArea()

  Square = Shape:new()

  -- Derived class method new

  function Square:new (o,side)

  o = o or Shape:new(o,side)

  setmetatable(o, self)

  self.__index = self

  return o

  end

  -- Derived class method printArea

  function Square:printArea ()

  print("The area of square is ",self.area)

  end

  -- Creating an object

  mysquare = Square:new(nil,10)

  mysquare:printArea()

  Rectangle = Shape:new()

  -- Derived class method new

  function Rectangle:new (o,length,breadth)

  o = o or Shape:new(o)

  setmetatable(o, self)

  self.__index = self

  self.area = length * breadth

  return o

  end

  -- Derived class method printArea

  function Rectangle:printArea ()

  print("The area of Rectangle is ",self.area)

  end

  -- Creating an object

  myrectangle = Rectangle:new(nil,10,20)

  myrectangle:printArea()

  当我们运行上面的程序,会得到下面的输出。

   代码如下:

  The area is 100

  The area of square is 100

  The area of Rectangle is 200

  在上面的例子中,我们创建了两个派生类Rectangle和Square从基类Square。因此能够在此改变基类的功能的派生类。在本实现例子中,派生类会取代函数printArea。