脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Lua - 浅谈Lua的面向对象特性

浅谈Lua的面向对象特性

2020-05-04 12:35脚本之家 Lua

这篇文章主要介绍了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。

延伸 · 阅读

精彩推荐
  • LuaLua和C语言的交互详解

    Lua和C语言的交互详解

    这篇文章主要介绍了Lua和C语言的交互详解,Lua和C语言通过栈完成交互,本文结合代码实例详细讲解了交互的方法,需要的朋友可以参考下 ...

    果冻想3702020-04-14
  • LuaLua中table库函数方法介绍

    Lua中table库函数方法介绍

    这篇文章主要介绍了Lua中table库函数方法介绍,本文讲解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以参考下 ...

    脚本之家2502020-04-17
  • LuaLua中计算、执行字符串中Lua代码的方法

    Lua中计算、执行字符串中Lua代码的方法

    这篇文章主要介绍了Lua中计算、执行字符串中Lua代码的方法,类似JavaScript中eval函数的功能,在Lua中也可以实现,需要的朋友可以参考下 ...

    脚本之家6322020-04-30
  • LuaLua中的元方法__newindex详解

    Lua中的元方法__newindex详解

    这篇文章主要介绍了Lua中的元方法__newindex详解,本文讲解了查询与更新、监控赋值、通过table给另一个table赋值等内容,需要的朋友可以参考下 ...

    笨木头8872020-04-09
  • Lua深入探究Lua中的解析表达式

    深入探究Lua中的解析表达式

    这篇文章主要介绍了深入探究Lua中的解析表达式,对于其语法部分的说明和示例都超详细,极力推荐此文!需要的朋友可以参考下 ...

    脚本之家3542020-05-05
  • LuaLua实现__add方法重载示例

    Lua实现__add方法重载示例

    这篇文章主要介绍了Lua实现__add方法重载示例,本文直接给出实现代码,需要的朋友可以参考下 ...

    脚本之家7452020-04-24
  • LuaLua简介、编译安装教程及变量等语法介绍

    Lua简介、编译安装教程及变量等语法介绍

    这篇文章主要介绍了Lua简介、编译安装教程及变量等语法介绍,本文同时讲解了lua注释语法、Lua命令行方式等内容,需要的朋友可以参考下 ...

    junjie3632020-04-14
  • LuaLua教程(二):基础知识、类型与值介绍

    Lua教程(二):基础知识、类型与值介绍

    这篇文章主要介绍了Lua教程(二):基础知识、类型与值介绍,本文讲解了Hello World程序、代码规范、全局变量、类型与值等内容,需要的朋友可以参考下 ...

    脚本之家5922020-04-28