【问题标题】:My Lua OOP Implementation我的 Lua OOP 实现
【发布时间】:2017-03-15 11:30:59
【问题描述】:

我在搞 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中的变量,所以它也继承了那些,然后我可以将特定的成员添加到子类中,并调用它们。所以如果它可以更好(但仍然相对轻量级),如果我会遇到意想不到的问题或者我正在做一些多余的事情,请告诉我。

【问题讨论】:

  • 目前还不清楚问题是什么。如果您想要代码审查,请改为发布here
  • 您的方法是错误的:您的 ChildClass 实例不会看到 ChildClass 表中的方法(但他们会看到 BaseClass 表中的方法)。

标签: class oop inheritance lua lua-table


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2014-01-01
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多