如何在我的示例中实现 Lua 面向对象编程?
2014-7-31 19:19:41
收藏:0
阅读:70
评论:2
我正在尝试在Lua中创建一个类,该类保存有关该类正在关注谁的信息,并且我还希望被关注的类了解它的关注者。
但是我的代码失败了,我不知道为什么。
错误是
lua:OOP.lua:90:尝试调用方法“getName”(空值)
--------
--FIELDS
--------
Vehicle.name = ""
Vehicle.vtype = "";
Vehicle.follower = {};
Vehicle.leader = {};
---------------------
--SETTERS AND GETTERS
---------------------
function Vehicle:setName(value)
self.name = value
end
function Vehicle:getName()
return self.name
end
function Vehicle:setType(value)
self.vtype = value
end
function Vehicle:getType()
return self.vtype
end
function Vehicle:setFollower(pVeh)
self.follower = {};
self.follower = pVeh;
end;
function Vehicle:getFollower()
return self.follower;
end;
function Vehicle:getLeader()
return self.leader;
end;
function Vehicle:setLeader(pVeh)
self.leader = pVeh;
if (self.leader ~= nil) then
print ("-- setted leader! --");
end;
end;
-----------
--METHODS--
-----------
function Vehicle:follow(pVeh) --> why does this not work?
self:setLeader(pVeh);
pVeh:setFollower(self);
end;
-- constructor
function newVehicle(pNm,pTp)
tbl = {}
setmetatable(tbl, {__index = Vehicle});
tbl:setName(pNm);
tbl:setType(pTp);
return tbl
end
-----------------------------------------------
-- TEST
-----------------------------------------------
local car1 = newVehicle("Mazda","Car");
local car2 = newVehicle("Harley","Bike");
print("--------------");
print (car1:getName()); --> prints "Mazda"
print (car2:getName()); --> prints "Harley"
car2:follow(car1)
print ("Leader of " .. car1:getName() .. " is " .. car1:getLeader():getName())
点赞
用户2698261
问题出现在你的测试代码中,据我所见:
print ("Leader of " .. car1:getName() .. " is " .. car1:getLeader():getName())
car1 没有定义领导者。(你做了 car2:follow(car1))
一些指针:
您需要在创建方法中定义字段表。这暂时不适用于您的代码,但是假设您想要执行编队。您可以执行类似于
Vehicle.platoon = {}; Tank1.platoon[Tank2] = true这样的操作 - 这将将Tank2添加到Vehicle的编队中,并与每个车辆共享。如果您在新方法中定义了这个 :function newVehicle(...) tbl.platoon = {} ... end,那么每辆车都会是唯一的。除非您有充分的理由使用它们,否则请勿使用访问器(get *,set *)方法。它们会添加杂乱,而且不利于性能。使用它们的一个好理由是如果您正在访问访问器方法中的表,并希望简化与该表的交互。 (即
Obj:addChild(Obj2)obj:hasChild(Obj2)),但然后它可能不再符合访问器的定义了:)对于未设置的字段,您可以使用虚拟对象。这将防止像你这样的错误:
local Dummy = newVehicle("None", "None") Vehicle.follower = Dummy Vehicle.leader = Dummy
在您的代码中,这将产生:
--------------
Mazda
Harley
-- 设置了领导者! --
Mazda的领导者是无
2014-07-31 19:34:58
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
car2正在追随(follow)car1。然而,稍后你试图访问car1的领导者,这当然会返回nil,从而导致错误。print("车辆"..car1:getName().."的追随者是"..car1:getFollower():getName())