编程知识 购物 网址 新闻 笑话 | 软件 日历 阅读 图书馆 China 头条阅读 学淘股 China Travel
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
   -> Lua -> 浅谈Lua的面向对象特性 -> 正文阅读

[Lua]浅谈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。
  Lua 最新文章
OpenResty中正则模式匹配的2种方法详解
Lua Table转C# Dictionary的方法示例
Lua语言新手简单入门教程
利用Lua定制Redis命令的方法详解
Lua判断变量是否为数字、字符串是否可以转换
Lua中设置table为只读属性的方法详解
Lua学习笔记之表和函数
简单的Lua 连接操作mysql数据库的方法
Lua 数学库的所有函数功能作用一览
Lua极简入门指南:全局变量
上一篇文章      下一篇文章      查看所有文章
加:2016-11-09 23:03:21  更:2017-05-14 02:46:08 
 
360图书馆 软件开发资料 购物精选 新闻资讯 Chinese Culture 三丰软件 开发 中国文化 阅读网 头条阅读 学淘股 China Travel 日历 万年历 2020年4日历
2020-4-9 2:53:29
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  编程知识