Lua面向对象
Lua 面向对象
面向对象概述
面向对象编程技术是目前最常用的编程技术之一。目前大量的编程语言都支持面向对象的特性:
- C++
- Java
- Objective-C
- Smalltalk
- C#
- Ruby
面向对象的特征
- 类(class):类是可以创建对象,并为状态(成员变量)提供初值及行为实现的可扩展模板。
- 对象(objects):对象是类的实例,每个对象都有独立的内存区域。
- 继承(inheritance):继承用于描述一个类的变量和函数被另一个类继承的行为。
- 封装(encapsulation):封装是指将数据和函数组织在一个类中。外部可以通过类的方法访问内中的数据。封装也被称之为数据抽象。
在 Lua 中,我们可以使用表和函数实现面向对象。将函数和相关的数据放置于同一个表中就形成了一个对象。继承可以用元表实现,它提供了在父类中查找存在的方法和变量的机制。
Lua 中的表拥有对象的特征,比如状态和独立于其值的标识。两个有相同值的对象(表)是两个不同的对象,但是一个对象在不同的时间可以拥有不同的值。与对象一样,表拥有独立于其创建者和创建位置的生命周期。
一个真实世界的例子
面向对象已经是一个广泛使用的概念,但是你需要正确清楚地理解它。
让我们看一个数学方面的例子。我们经常需要处理各种形状,比如圆、矩形、正方形。
这些形状有一个共同的特征——面积。所以,所有其它的形状都可以从有一个公共特征——面积的基类扩展而来。每个对象都可以有它自己的特征和函数,比如矩阵有属性长、宽和面积,printArea 和 calculateArea 方法。
创建一个简单的类
下面例子实现了矩阵类的三个属性:面积、长和宽。它还同时实现了输出面积的函数 printArea。
1 | -- 元类 |
r = Rectangle:new(nil,10,20)
1 |
|
print(r.length)
1 |
|
r:printArea()
1 |
|
– 元类
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()
1 |
|
The area is 100
1 |
|
– 元类
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
1 |
|
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
1 |
|
– 继承方法 printArea
function Square:printArea ()
print(“The area of square is “,self.area)
end
1 |
|
– 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()
1 |
|
The area is 100
The area of square is 100
The area of Rectangle is 200
上面的例子中,我们继承基类 Shape 创建了两个子类 Rectange 与 Square。在子类中可以重写基类提供的方法。在这个例子中,子类重写了 printArea 方法。