LUA面向对象程序设计(二)继承

 

在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中的继承,是不是挺简单的,麻麻再也不用担心我的学习了,呵呵!

 

(全文完)

你可能感兴趣的:(LUA面向对象程序设计(二)继承)