在Lua中模拟类的继承行为,可以通过setmetatable方法来实现。首先,我们就先实现一个基类Vehicle,然后再定义该基类的一个子类Bicycle,基类的定义与之前介绍的类的定义方法是一致的,如果你对此还不是很熟悉,可以先回顾一下《LUA面向对象程序设计(一)类》。
基类Vehicle的定义:
--类的属性
local Vehicle = {
wheels = 4,
speed = 100,
color = “b”
}
--有了这一句才能算是一个类,因为这一句实现了实例和类之间的关联性
Vehicle.__index = Vehicle
--构造函数
function Vehicle:New(wheels, speed, color)
local obj = {}
setmetatable(obj, self) --这里和上面的__index是遥相呼应的
obj.wheels = wheels
obj.speed = speed
obj.color = color
return obj
end
--基类的方法
function Vehicle:getSpeed()
print(self.speed)
end
function Vehicle:setSpeed(x)
self.speed = x
end
function Vehicle:speedPluss()
self.speed = self.speed + 1
end
下面看看Bicycle的定义:
local Bicycle = { engine = 1 }
setmetatable(Bicycle, Vehicle)--这里就实现了Bicycle对Vehicle的继承
Bicycle.__index = Bicycle --这样就实现了一个类,以便Bicycle的每个实例都到Bicycle进行查找
function Bicycle:New(engine)
local obj = {}
obj = Vehicle:New(2, 10, "r")
obj.engine = engine --除了继承基类成员外,添加自己成员
setmetatable(obj, self) --使得Bicycle的每个实例都与Bicycle挂钩
return obj
end
--对父类方法的重载
function Bicycle:setSpeed(s)
self.speed = s
end
function Bicycle:getSpeed()
print(self.speed)
end
--Bicycle自己的方法
function Bicycle:printAll()
print(self.speed .. "," .. self.wheels ..",".. self.color .. "," .. self.engine)
end
Ok,现在我们就可以建立Bicycle的对象了:
--创建Bicycle的两个对象
ob1 = Bicycle:New(2)
ob2 = Bicycle:New(3)
ob1:printAll()
ob2:printAll()
ob1:setSpeed(15)
ob2:speedPluss()
ob1:printAll()
ob2:printAll()
输出的结果:
10,2,r,2
10,2,r,3
15,2,r,2
11,2,r,3
可以看到,子类的实例ob2可以运行父类的方法,此外,子类也能重载父类的方法,各个实例之间是没有任何影响的。Bicycle继承了父类的属性和方法,同时也声明了属于自己的属性和方法。这就是Lua中的继承,是不是挺简单的,麻麻再也不用担心我的学习了,呵呵!
(全文完)