浅谈Lua的面向对象特性

 更新时间:2015年05月29日 11:37:27   投稿:goldensun  
这篇文章主要介绍了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。

相关文章

  • Lua中的闭包学习笔记

    Lua中的闭包学习笔记

    这篇文章主要介绍了Lua中的闭包学习笔记,闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量),需要的朋友可以参考下
    2014-12-12
  • Lua中实现sleep函数功能的4种方法

    Lua中实现sleep函数功能的4种方法

    这篇文章主要介绍了Lua中实现sleep函数功能的4种方法,本文讲解了在一个死循环中设置一个跳出条件方法、调用系统的sleep函数法、Windows下ping命令法、socket库中select函数法4种方法,需要的朋友可以参考下
    2015-04-04
  • Lua教程(十六):系统库(os库)

    Lua教程(十六):系统库(os库)

    这篇文章主要介绍了Lua教程(十六):系统库(os库)本文着重讲解了OS库中的日期和时间操作和其他系统调用两部份内容,需要的朋友可以参考下
    2015-04-04
  • Lua中的持久化和序列化详解

    Lua中的持久化和序列化详解

    这篇文章主要介绍了Lua中的持久化和序列化详解,本文详细讲解了Lua中的持久化和序列化,并给出代码实例,需要的朋友可以参考下
    2014-09-09
  • Lua中执行系统命令方法介绍

    Lua中执行系统命令方法介绍

    这篇文章主要介绍了Lua中执行系统命令方法介绍,Lua中有两种方法可以执行操作系统内置命令,需要的朋友可以参考下
    2015-04-04
  • Lua脚本语言概述

    Lua脚本语言概述

    这篇文章主要介绍了Lua脚本语言概述,本文讲解了Lua是什么、Lua语言的特性、Lua的使用范围、Lua的基本内容、Lua虚拟机等内容,需要的朋友可以参考下
    2014-09-09
  • Lua UnPack函数用法实例

    Lua UnPack函数用法实例

    这篇文章主要介绍了Lua UnPack函数用法实例,unpack它接受一个数组(table)作为参数,并默认从下标1开始返回数组的所有元素,需要的朋友可以参考下
    2015-04-04
  • Lua中的__index方法详解

    Lua中的__index方法详解

    这篇文章主要介绍了Lua中的__index方法详解,本文详细讲解了__index方法的相关知识,以及代码示例,需要的朋友可以参考下
    2015-04-04
  • Lua编程示例(二):面向对象、metatable对表进行扩展

    Lua编程示例(二):面向对象、metatable对表进行扩展

    这篇文章主要介绍了Lua编程示例(二):面向对象、metatable对表进行扩展,本文直接给出实例代码,需要的朋友可以参考下
    2015-07-07
  • Lua中的变量和流控制入门学习

    Lua中的变量和流控制入门学习

    这篇文章主要介绍了Lua中的变量和流控制入门学习,其中--两个横线开始单行的注释,--[[加上两个[和]表示多行的注释--]],需要的朋友可以参考下
    2015-07-07

最新评论