我正在尝试在Lua中创建一个类,它包含关于这个类跟随者的信息,我也希望跟随课程了解他的追随者。
但是我的代码失败了,我不知道为什么。
错误是
lua:OOP.lua:90:尝试调用方法' getName' (零值)
Vehicle = {}
--------
--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())
答案 0 :(得分:2)
问题出在您的测试代码中,我可以看到:
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
-- setted leader! --
Leader of Mazda is None
答案 1 :(得分:1)
car2:follow(car1)
car1
跟随<{em> car2
。而后来;你正试图访问car1
的领导者,当然这会返回nil
。因此错误。
print( "Follower of "..car1:getName().." is "..car1:getFollower():getName() )