Lua 面向对象

简介:

面向对象特征

  • 1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。

  • 2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。

  • 3) 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

  • 4)抽象:抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。


Lua 中面向对象

我们知道,对象由属性和方法组成。LUA中最基本的结构是table,所以需要用table来描述对象的属性。

lua中的function可以用来表示方法。那么LUA中的类可以通过table + function模拟出来。

至于继承,可以通过metetable模拟出来(不推荐用,只模拟最基本的对象大部分时间够用了)。


Lua中的表不仅在某种意义上是一种对象。像对象一样,表也有状态(成员变量);也有与对象的值独立的本性,特别是拥有两个不同值的对象(table)代表两个不同的对象;一个对象在不同的时候也可以有不同的值,但他始终是一个对象;与对象类似,表的生命周期与其由什么创建、在哪创建没有关系。对象有他们的成员函数,表也有。

创建对象是位类的实例分配内存的过程。每个类都有属于自己的内存并共享公共数据。


访问属性

我们可以使用点号(.)来访问类的属性:

print(r.length)

访问成员函数

我们可以使用冒号 : 来访问类的成员函数:

r:printArea()

内存在对象初始化时分配。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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( "面积为 : " ,self.area)
end
 
--创建对象
myshape = Shape: new (nil,12)
 
myshape:printArea()

运行结果:

wKiom1mpVyXDw2LCAAB1dLYKtBs478.jpg-wh_50


继承了一个简单的类,来扩展派生类的方法,派生类中保留了继承类的成员变量和方法:

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
  -- 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( "面积为       :" ,self.area)
end
 
-- 创建对象
myshape = Shape: new (nil,12)
myshape:printArea()
 
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( "正方形面积为 : " ,self.area)
end
 
-- 创建对象
mysquare = Square: new (nil,15)
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( "矩形面积为   : " ,self.area)
end
 
-- 创建对象
myrectangle = Rectangle: new (nil,18,22)
myrectangle:printArea()

运行结果:

wKioL1mpXefxjdW_AACHeF2Qgs0840.jpg-wh_50




面向对象特征

  • 1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。

  • 2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。

  • 3) 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

  • 4)抽象:抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。


Lua 中面向对象

我们知道,对象由属性和方法组成。LUA中最基本的结构是table,所以需要用table来描述对象的属性。

lua中的function可以用来表示方法。那么LUA中的类可以通过table + function模拟出来。

至于继承,可以通过metetable模拟出来(不推荐用,只模拟最基本的对象大部分时间够用了)。


Lua中的表不仅在某种意义上是一种对象。像对象一样,表也有状态(成员变量);也有与对象的值独立的本性,特别是拥有两个不同值的对象(table)代表两个不同的对象;一个对象在不同的时候也可以有不同的值,但他始终是一个对象;与对象类似,表的生命周期与其由什么创建、在哪创建没有关系。对象有他们的成员函数,表也有。

创建对象是位类的实例分配内存的过程。每个类都有属于自己的内存并共享公共数据。


访问属性

我们可以使用点号(.)来访问类的属性:

print(r.length)

访问成员函数

我们可以使用冒号 : 来访问类的成员函数:

r:printArea()

内存在对象初始化时分配。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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( "面积为 : " ,self.area)
end
 
--创建对象
myshape = Shape: new (nil,12)
 
myshape:printArea()

运行结果:

wKiom1mpVyXDw2LCAAB1dLYKtBs478.jpg-wh_50


继承了一个简单的类,来扩展派生类的方法,派生类中保留了继承类的成员变量和方法:

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
  -- 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( "面积为       :" ,self.area)
end
 
-- 创建对象
myshape = Shape: new (nil,12)
myshape:printArea()
 
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( "正方形面积为 : " ,self.area)
end
 
-- 创建对象
mysquare = Square: new (nil,15)
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( "矩形面积为   : " ,self.area)
end
 
-- 创建对象
myrectangle = Rectangle: new (nil,18,22)
myrectangle:printArea()

运行结果:

wKioL1mpXefxjdW_AACHeF2Qgs0840.jpg-wh_50



本文转自 liam2199 博客,原文链接:     http://blog.51cto.com/liam2199/1962043      如需转载请自行联系原作者



相关文章
|
6月前
|
C++ 索引 Python
Lua中self 、自索引及其面向对象应用代码示例
Lua中self 、自索引及其面向对象应用代码示例
|
1月前
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
Lua的面向对象编程、协同线程与协同函数的概念和使用,以及Lua文件I/O操作的基本方法。
28 4
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
Lua程序设计(三)面向对象实现一个简单的类
1.Lua面向对象实现步骤 ①创建一个全局表(称之为元表) ②设置这个元表的__index值(值通常为元表自己,这样就能通过__index查找到对应的属性和方法)__index 赋值其实是一个function的语法糖,Sharp.
1317 0
Lua程序设计(四)面向对象类继承
1.类继承  ①代码 Sharp = { _val = 1} --① 父类 function Sharp:new() local new_sharp = { } self.__index = self --②,self == Sharp setmetatable(n...
852 0
|
索引
Lua程序设计(二)面向对象概念介绍
----------------------------------------------------------- Lua面向对象3 local smartMan = { name = "Tinywan", age = 26, money = 800000, ...
913 0
Lua程序设计(一)面向对象概念介绍
  完整代码 local mt = {} mt.__add = function(t1,t2) print("两个Table 相加的时候会调用我") end local t1 = {} local t2 = {} -- 给两个table 设置新的元表,一个元表...
1010 0
|
1月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
29 2