基本上语法会像这样
object = {}
object.base = ?
object.value = 0
function object:create(x, y)
local copy
--copy table
if type(self) == "table" then
copy = {} for k, v in pairs(self) do copy[k] = v:create() end
else
copy = self
end
--set base
copy.base = self
--set copy vars
copy.x = x
copy.y = y
return copy
end
function object:update()
self.value = self.value + 1
end
player = object:create()
player.value = 1
function player:create(x, y, size)
base:create(x, y) --inherit base event
end
--automaticly inherits update event since it is not redeclared
我不知道如何做到这一点
答案 0 :(得分:1)
Lua中的继承基本上是使用metatables实现的。在代码中:
function object:new (o)
o = o or {}
-- Put the rest of your create function code here
setmetatable(o, self)
self.__index = self
return o
end
function object:update()
self.value = self.value + 1
end
现在创建一个空的Player class
,它将成为你的基础Object class
的一个子类,并将继承它的所有行为。
Player = Object:new()
Player
现在是Object
的一个实例。实例化一个新的Player
对象p
,以便从new
继承Object
方法。
p = Player:new{x=1, y=2, size=3}
但是,这一次,new
执行时,self
参数将引用player
。因此,p
的元格将为Player
,其索引__index
的值也为Player
。因此,p
继承自Player
,继承自Object
。
现在你要编码:
p:create{x=10, y=20, size=100}
lua在create
中找不到p
字段,因此它会查看Player
类;它也不会在那里找到create
字段,因此会调查Object
并在那里找到create
的原始实现。 update
函数也会发生同样的事情。
当然Player
类可以重新定义从其超类Object
继承的任何方法。例如,您可以重新定义 - 如果您需要 - create
函数:
function Player:create()
--New create code for Player
end
现在,当您致电p:create{x=10, y=20, size=190}
时,Lua将无法访问Object
课程,因为它首先会在create
中找到新的Player
功能。
答案 1 :(得分:0)
您正在直接引用base
,而实际上它是您的玩家对象的属性:
function player:create(x, y, size)
self.base:create(x, y)
end