我搞乱了Lua,试图让OOP工作,遇到了一些问题,一切都在我的最后工作,但我想知道我是否遗漏了任何东西,或者是一个意想不到的问题使用这种方法来实现oop。
基本上我有一个基类
local BaseClass = {}
function BaseClass.new()
local self = setmetatable({}, BaseClass)
return self
end
然后是一个儿童班
local ChildClass = {}
function ChildClass.new()
local self = BaseClass.new()
return self
end
同样,一切正常,子类继承了基类中的所有成员,而我理解的方法基本上都是lua中的变量,所以它也继承了那些,然后我可以将特定成员添加到子类中,并调用它们。因此,如果它可能更好(但仍然相对轻量级),如果我遇到意外问题或者我做了多余的事情,请告诉我。
答案 0 :(得分:1)
你打破了链条。从ChildClass.new
返回的表格与ChildClass
表格无关。
您需要查看Chapter 16 of Programming in Lua,其中讨论了实现面向对象编程的典型方法。
归结为,如果要维护链,则需要通过self
描述符使用隐式:
。您不需要手动定义ChildClass
构造函数,而是让它继承BaseClass
中的构造函数,使其成为实例的各种类型。
local BaseClass = {}
function BaseClass:new()
self.__index = self
return setmetatable({}, self)
end
local ChildClass = BaseClass:new()
现在,您可以为ChildClass
。
function ChildClass:foo ()
print('foo!')
end
local child_inst = ChildClass:new()
child_inst:foo()