由于lua本身并非面向对象语言,为了方便开发者quick用class方法实现了面向对象的模拟,但使用起来还是有些问题要注意的,今天就来分享一下我解决自己的一个理解误区。
基类
Person.lua
local Person = class("Person")
function Person:ctor()
print("Person:ctor")
self:init()
end
function Person:init()
print("Person:init")
end
return Person
子类
Hero.lua
local Hero = class("Hero",require("app.person.Person"))
function Hero:ctor()
print("Hero:ctor")
self.super.ctor(self)
self:init()
end
function Hero:init()
print("Hero:init")
end
return Hero
测试代码
MainScene.lua
local Hero = require("app.person.Hero")
local MainScene = class("MainScene", function()
return display.newScene("MainScene")
end)
function MainScene:ctor()
local hero = Hero.new()
end
return MainScene
当时我认为它的输出应该是:
Hero:ctor
Person:ctor
Person:init
Hero:init
然而当它真正跑起来时答案却是:
Hero:ctor
Person:ctor
Hero:init
Hero:init
这可不是我想要的结果,后来想了想发现调用self.super.ctor(self)的时候其实那个self传递进去的是Hero的引用,所以在Person中调用init时,
那个self并不是Person本身而是传递进来的Hero的引用,所以就出现了那样的结果。
解决问题的办法就是把self.super.ctor(self)换成self.super.ctor(self.super)就行了。
--------------------------------------------朴实的分割线-----------------------------------
上面的理解有些问题,重新编辑,正解在评论区,Hero.super.ctor(self) 和 Hero.super.ctor(Hero) 的区别就看self 和 Hero是不是相同了,但是还是理解的有点模糊,如果有人能够举个例子清晰的解释下就好了。
