Lua中的子类构造器方法
2016-10-12 19:8:35
收藏:0
阅读:135
评论:2
在Lua中理解继承(和元表)的概念有些困难。官方教程没有明确讲解如何为子类创建构造器。
我的示例的问题在于player:move()是nil,所以player仍然是Object类。
-- 通用类
Object = {}
function Object:new (type,id,name)
o = {}
self.type = type or "none"
self.id = id or 0
self.name = name or "noname"
setmetatable(o, self)
self.__index = self
return o
end
function Object:place(x,y)
self.x = x
self.y = y
end
-- 玩家类
Player = Object:new()
function Player:new(id,name)
o = Object:new("player",id,name)
o.inventory = {}
o.collisions = {}
return o
end
function Player:move(x,y)
return print("移动到 " ..x.." x " .. y)
end
local player = Player:new(1, "plyr1")
player:move(2,2)
点赞
用户1847592
在类继承中的示例
通用类
Object = {}
function Object:__tostring()
if rawget(self, "type") then -- 只有类有 "type" 字段
return "Class: "..tostring(self.type)
else -- 类的实例没有 "type" 字段
return
"Type: "..tostring(self.type)..", id: "..tostring(self.id)
..", name: "..tostring(self.name)
end
end
function Object:newChildClass(type) -- 子类的构造函数
self.__index = self
return
setmetatable({
type = type or "none",
parentClass = self,
__tostring = self.__tostring
}, self)
end
function Object:new(id, name) -- 实例的构造函数
self.__index = self
return
setmetatable({
id = id or 0,
name = name or "noname"
}, self)
end
function Object:place(x,y)
self.x = x
self.y = y
end
玩家类
Player = Object:newChildClass("player")
function Player:new(id,name)
local o = Player.parentClass.new(self, id, name) -- 调用继承的构造函数
o.inventory = {}
o.collisions = {}
return o
end
function Player:move(x, y)
self:place(x, y)
print("moved to (" ..self.x..", " .. self.y..")")
end
local player = Player:new(1, "plyr1")
print(player) --> Type: player, id: 1, name: plyr1
player:move(2,2) --> moved to (2, 2)
如何创建子类并调用继承的方法
Dog = Player:newChildClass("dog")
--- 我们想要覆盖类 "dog" 中的方法 "move"
function Dog:move(x, y)
Dog.parentClass.move(self, x, y) -- 调用继承的方法 "move"
print("Woof!") -- 狗每次移动后会叫 "Woof!"
end
local dog = Dog:new(42, "dg42")
print(dog) --> Type: dog, id: 42, name: dg42
dog:move(3,4) --> moved to (3, 4)
--> Woof!
2016-10-12 20:28:54
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

在构造函数
Player:new中,我们通过以下代码行返回一个Object类的对象:o = Object:new("player",id,name)一旦我们移除它,
player:move()就会被调用:moved to 2 x 2原因是,尽管我们调用了
Player:new构造函数,但实际上我们在其中返回的是一个Object类的实例。在这种情况下,o是一个继承属性。