当前位置: 首页 > 编程笔记 >

浅谈Lua的面向对象特性

云浩然
2023-03-14
本文向大家介绍浅谈Lua的面向对象特性,包括了浅谈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。

 类似资料:
  • 本文向大家介绍浅谈JavaScript面向对象--继承,包括了浅谈JavaScript面向对象--继承的使用技巧和注意事项,需要的朋友参考一下 一、继承的概念 子类共享父类的数据和方法的行为,就叫继承。 二、E55如何实现继承?探索JavaScript继承的本质 2.1构造函数之间的“复制粘贴” 第一条路是通过构造函数来继承,这可以理解为子类直接复制了父类构造函数的代码,然后按照一定的规矩“粘贴”

  • 主要内容:面向对象特征,Lua 中面向对象,实例,实例,Lua 继承,实例,函数重写面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。 以下几种编程语言都支持面向对象编程: C++ Java Objective-C Smalltalk C# Ruby 面向对象特征 1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。 2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以

  • 面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。 以下几种编程语言都支持面向对象编程: C++ Java Objective-C Smalltalk C# Ruby 面向对象特征 1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。 2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以

  • 本文向大家介绍谈谈你对面向对象的理解?相关面试题,主要包含被问及谈谈你对面向对象的理解?时的应答技巧和注意事项,需要的朋友参考一下 所谓对象就是由一组数据结构和处理它们的方法组成的,重点“数据”包括对象的特性、状态等的静态信息;“方法” 也就是行为,包括该对象的对数据的操作、功能等能动信息。把相同行为的对象归纳为类,类是一个抽象的概念,对象是类的具体。简单点说:对象就是类的实例。例如:小品演员就是

  • 本文向大家介绍浅谈Java实现面向对象编程java oop,包括了浅谈Java实现面向对象编程java oop的使用技巧和注意事项,需要的朋友参考一下 一、对象的综述 面向对象编程(OOP)具有多方面的吸引力。对管理人员,它实现了更快和更廉价的开发与维护过程。对分析与设计人员,建模处理变得更加简单,能生成清晰、易于维护的设计方案。对程序员,对象模型显得如此高雅和浅显。此外,面向对象工具以及库的巨大

  • 本文向大家介绍浅谈C++对象组合,包括了浅谈C++对象组合的使用技巧和注意事项,需要的朋友参考一下 以上所述就是本文的全部内容了,希望大家能够喜欢。