教程 > lua 教程 > 阅读:96

lua 面向对象——迹忆客-ag捕鱼王app官网

面向对象编程(oop)是现代编程时代最常用的编程技术之一。 有许多支持 oop 的编程语言,包括:

  • c
  • java
  • objective-c
  • smalltalk
  • c#
  • ruby

面向对象的特点

  • - 类是用于创建对象、为状态(成员变量)和行为实现提供初始值的可扩展模板。
  • 对象 - 它是类的一个实例,并为自己分配了单独的内存。
  • 继承 - 这是一个概念,一个类的变量和函数被另一个类继承。
  • 封装 - 这是在类中组合数据和函数的过程。 在函数的帮助下,可以在类外访问数据。 它也被称为数据抽象。

lua 中的面向对象

我们可以借助 lua 的表和一流的函数在 lua 中实现面向对象。 通过将函数和相关数据放入表中,就形成了一个对象。 继承可以在元表的帮助下实现,为父对象中不存在的函数(方法)和字段提供查找机制。

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}
-- 基类方法 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
-- 基类方法 printarea
function shape:printarea ()
   print("the area is ",self.area)
end
-- 创建一个对象
myshape = shape:new(nil,10)
myshape:printarea()

上面程序运行结果如下所示

the area is     100

lua 中的继承

继承是将简单的基础对象(如形状)扩展到矩形、正方形等的过程。 它经常在现实世界中用于共享和扩展基本属性和功能。

让我们看一个简单的类扩展。 我们有一个类,如下所示。

-- meta class
shape = {area = 0}
-- 基类方法 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
-- 基类方法 printarea
function shape:printarea ()
   print("the area is ",self.area)
end

我们可以将形状扩展到正方形类,如下所示。

square = shape:new()
-- 派生类方法 new
function square:new (o,side)
   o = o or shape:new(o,side)
   setmetatable(o, self)
   self.__index = self
   return o
end

覆盖基函数

我们可以重写基类函数,而不是使用基类中的函数,派生类可以有自己的实现,如下所示

-- 派生类方法 printarea
function square:printarea ()
   print("the area of square is ",self.area)
end

继承完整示例

我们可以在元表的帮助下借助另一个新方法来扩展 lua 中的简单类实现,如上所示。 基类的所有成员变量和函数都保留在派生类中。

-- meta class
shape = {area = 0}
-- 基类方法 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
-- 基类方法 printarea
function shape:printarea ()
   print("the area is ",self.area)
end
-- 创建一个对象
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
-- 派生类方法 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()
-- 派生类方法 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
-- 派生类方法 printarea
function rectangle:printarea ()
    print("the area of rectangle is ",self.area)
end
-- 创建一个对象
myrectangle = rectangle:new(nil,10,20)
myrectangle:printarea()

上述代码运行结果如下

the area is     100
the area of square is     100
the area of rectangle is     200

在上面的示例中,我们从基类 square 创建了两个派生类 - rectanglesquare。 可以在派生类中覆盖基类的功能。 在此示例中,派生类覆盖函数 printarea

查看笔记

扫码一下
查看教程更方便
网站地图