浅谈Lua的面向对象特性

 更新时间:2015年05月29日 11:37:27   投稿:goldensun  
这篇文章主要介绍了Lua的面向对象特性,包括对象和继承等传统OOP概念的几个关键知识点,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

 面向对象的特性

  •     类: 类是可扩展的模板用来创建对象,提供状态的初始值(成员变量)和行为的实现。
  •     对象: 它是类的实例并具有分配给自己独立的内存。
  •     继承: 它是由变量和类的函数被其他类继承的概念。
  •     封装: 它是将数据和函数相结合的一类内的方法。数据可以在类的外部与函数的帮助下进行访问。它也被称为数据抽象。

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中的基本数据类型详细介绍,本文详细的讲解了Lua中的8种基本数据类型,需要的朋友可以参考下
    2014-09-09
  • Lua实现类继承

    Lua实现类继承

    这里给大家演示的是一个使用lua实现类继承的示例,实现类继承其实有很多种写法,这里是本人常用的方法,推荐给大家。
    2015-03-03
  • Lua中string.len()使用指南

    Lua中string.len()使用指南

    Lua 字符串库中的所有函数都导出在模块 string 中,今天我们先来看看string.len()的使用,有需要的小伙伴可以参考下
    2016-08-08
  • Lua中os库详细介绍

    Lua中os库详细介绍

    这篇文章主要介绍了Lua中os库详细介绍,本文详细讲解了OS库中的常用方法,分别对参数做出了解释,有的给出了示例,需要的朋友可以参考下
    2014-11-11
  • Lua面向对象之类和继承

    Lua面向对象之类和继承

    这篇文章主要介绍了Lua面向对象之类和继承,本文讲解了Lua面向对象最基本的知识类和继承,需要的朋友可以参考下
    2014-09-09
  • Lua中创建全局变量的小技巧(禁止未预期的全局变量)

    Lua中创建全局变量的小技巧(禁止未预期的全局变量)

    这篇文章主要介绍了Lua中创建全局变量的小技巧(禁止未预期的全局变量),使用本文方法可以实现避免创建全局变量,在必须使用全局变量的情况下也给出了实现技巧,需要的朋友可以参考下
    2014-12-12
  • Lua教程(六):绑定一个简单的C++类

    Lua教程(六):绑定一个简单的C++类

    这篇文章主要介绍了Lua教程(六):绑定一个简单的C++类,本文是最后一篇C/C++与Lua交互的教程,其他教程请参阅本文下方的相关文章,需要的朋友可以参考下
    2014-09-09
  • Lua中的元方法__newindex详解

    Lua中的元方法__newindex详解

    这篇文章主要介绍了Lua中的元方法__newindex详解,本文讲解了查询与更新、监控赋值、通过table给另一个table赋值等内容,需要的朋友可以参考下
    2014-09-09
  • Lua 数学库的所有函数功能作用一览

    Lua 数学库的所有函数功能作用一览

    这篇文章主要介绍了Lua 数学库的所有函数功能作用一览,本文罗列了lua数学库的所有函数,并对每个函数的功能作用做了简短描述,需要的朋友可以参考下
    2015-06-06
  • Lua教程(一):简介、优势和应用场景介绍

    Lua教程(一):简介、优势和应用场景介绍

    这篇文章主要介绍了Lua教程(一):简介、优势和应用场景介绍,本文是Lua教程系列文章的第一篇,需要的朋友可以参考下
    2015-04-04

最新评论

?


http://www.vxiaotou.com