• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    浅谈Lua的面向对象特性

     面向对象的特性

    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。

    您可能感兴趣的文章:
    • PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
    • javascript面向对象程序设计高级特性经典教程(值得收藏)
    • C# 面向对象三大特性:封装、继承、多态
    • 深入理解Android组件间通信机制对面向对象特性的影响详解
    • 利用javascript的面向对象的特性实现限制试用期
    • php学习笔记 php中面向对象三大特性之一[封装性]的应用
    • Javascript 面向对象特性
    • javascript 的面向对象特性参考
    • 面向对象三大特性的意义讲解
    上一篇:简单讲解Lua中的垃圾回收机制
    下一篇:Lua下基本的网络编程示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    浅谈Lua的面向对象特性 浅谈,Lua,的,面向,对象,特性,