Lua面向对象

对象由属性和方法组成。Lua中最基本的结构是表,因此可以使用表描述对象属性,用Lua的函数来表示方法。即,Lua中的类可以通过表+函数模拟出来。至于继承,则可以通过元表模拟出来(不推荐使用,在Lua中模拟最基本的对象特性,通常情况下就够用了)。

一、Lua中的面向对象

Lua中的表在某种意义上就是一种对象。我们可以使用表和函数实现面向对象,将函数和相关数据放置于同一个表中就形成了一个对象。我们来看一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- Meta class
local rectangle = { length = 0, breadth = 0, area = 0 }

-- 类方法 new
function rectangle.new(self, obj, length, breadth)
obj = obj or {}
setmetatable(obj, self)
self.__index = self
self.length = length or 0
self.breadth = breadth or 0
self.area = length * breadth
return obj
end

-- 类方法 printarea
function rectangle.printarea(self)
print("rectangle area is: ", self.area)
end

这个类包含了3个属性(length、breadth、area)和1个方法(printarea)。对于一个类我们常做的操作有:

  • 实例化类:
1
r = rectangle:new(nil,10,20)
  • 访问属性:
1
print(r.length)
  • 访问方法:
1
r:printarea()
  • 方法重写:
1
2
3
function r:printarea()
print("square area is: ", self.area)
end

二、继承

继承是指一个对象直接使用另一个对象的属性和方法,可用于扩展基础类的属性和方法。在Lua中,继承可通过元表来实现。我们来看一个具体的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
-- Meta class
Shape = { area = 0 }

-- 基础类方法 new
function Shape.new(self, o, side)
o = o or {}
setmetatable(o, self)
self.__index = sself
side = side or {}
self.data = side * side
return o
end

-- 基础类方法 printarea
function Shape:printarea()
print("shape are is: ", self.area)
end

-- 创建对象
myshape = Shape:new(nil, 10)
myshape.printarea()


Square = Shape:new()

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

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

-- 创建对象
mysquare = Square:new(nil, 10)
mysquare:printarea()


Rectangle = Shape:new()

-- 派生类方法 new
function Rectangle.new(self, 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("rectangle area is ", self.area)
end

-- 创建对象
myrectangle = Rectangle:new(nil, 10, 20)
myrectangle.printarea()

其运行结果为:

1

三、成员私有性


Lua面向对象
https://kuberxy.github.io/2020/12/21/Lua面向对象/
作者
Mr.x
发布于
2020年12月21日
许可协议