是否可以将继承与Codea一起使用?虽然我对Lua相当新,但是从一些快速谷歌搜索来看,the methods看起来inheritance and polymorphism有点“involved”。是否有任何技术可以安全地使用Codea的Lua托管引擎?
这是一个简单的可运行测试,我正在努力工作。我的超类:
Superklass = class()
function Superklass:init(x,y)
self.x = x
self.y = y
end
function Superklass:debug()
print(string.format("(%d, %d)", self.x, self.y))
end
子类:
Ship = class()
function Ship:init(x, y)
-- you can accept and set parameters here
print('ship:init() called')
self = Superklass(x,y) -- ???
print('attempting to call self:debug()')
self:debug() -- works! prints
print('ok!')
end
function Ship:draw()
print('ship:draw() called')
print('attempting to call self:debug()')
self:debug()
print('ok')
end
程序入口点:
-- initial setup
function setup()
ship = Ship(HEIGHT/2, WIDTH/2)
end
-- called once every frame
function draw()
ship:draw()
end
这是运行的输出:
ship:init() called
attempting to call self:debug()
(384, 375)
ok!
ship:draw() called
attempting to call self:debug()
error: [string "Ship = class()..."]:16: attempt to call method 'debug' (a nil value)
Pausing playback
我确信这是非常幼稚的 - 但我希望能够在Codea的背景下找到可能有效的方向。
答案 0 :(得分:3)
只是提供一个有效的解决方案(Codea中的类继承)并指出一些陷阱。首先,我应该注意Codea按Tab键顺序加载类,因此超类的选项卡必须在之前子类的选项卡。我建议查看this thread on the Codea forums。它讨论了下面的技术,并对底层机制进行了一些了解。
首先,我们定义一个超类 AbstractSprite ,其构造函数采用(x,y)坐标。它提供了一种方法 debug ,以将此坐标回显到控制台。
AbstractSprite = class()
function AbstractSprite:init(x,y)
self.position = vec2(x,y)
print("new AbstractSprite created")
end
function AbstractSprite:debug()
print(string.format("(%d,%d)", self.position.x, self.position.y))
end
接下来,我们定义一个实现类 Ship ,它实现了一个调用 super 的自定义 debug ,演示了如何向上移动类层次结构
Ship = class(AbstractSprite)
function Ship:init()
AbstractSprite.init(self)
print("new Ship created")
end
function Ship:debug()
print("I am a ship, calling my superclasses' methods!")
AbstractSprite.debug(self)
end
程序入口点。我们创建了 Ship 和'raw' AbstractSprite ,并在每个上调用debug:
function setup()
ship = Ship()
ship:debug()
asteroid = AbstractSprite(150, 200)
asteroid:debug()
end
和控制台输出:
new AbstractSprite created
new Ship created
I am a ship, calling my superclasses' methods!
(0,0)
new AbstractSprite created
(150,200)
答案 1 :(得分:2)
免责声明:我是middleclass的作者,是Lua的OO-lib。
你在第一个例子中指出的基于闭包的是一个很好的智力练习,但它没有什么实际价值。在Lua中,使用表可以更好地实现面向对象(正如您的第二个示例所指出的示例所示) - 它以更快的速率提供相同的功能。唯一的区别是语法上的。
有许多库使用基于标准表的方法在Lua中执行OO。你可以在这里找到一个列表:
http://lua-users.org/wiki/ObjectOrientedProgramming
使用middleclass,你的代码会变成这样:
require 'middleclass'
-- middleclass needs the class name as a parameter
SuperClass = class('SuperClass') -- I don't see the point of using a K here, BTW
function SuperClass:initialize(x,y) -- initialize instead of init
self.x = x
self.y = y
end
function SuperClass:debug()
print(string.format("(%d, %d)", self.x, self.y))
end
--
Ship = class('Ship', SuperClass) -- notice that we put the superclass here
function Ship:initialize(x, y) -- initialize instead of init again
-- you can accept and set parameters here
print('ship:initialize() called')
self = SuperClass.initialize(self,x,y) -- notice the extra self and initialize here
print('attempting to call self:debug()')
self:debug() -- works! prints
print('ok!')
end
function Ship:draw()
print('ship:draw() called')
print('attempting to call self:debug()')
self:debug()
print('ok')
end