2016-11-02 42 views
1

我在搞乱Lua,试图让OOP工作,遇到一些问题,一切都在我的最后,但是我想知道如果我错过了什么,或者意外的问题会拿出这个方法来实现oop。我的Lua 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 

再次,一切正常,该childclass继承了基类的所有成员,并以我的理解方法基本上都是lua中的变量,所以它也继承了这些,然后我可以将特定的成员添加到childclass中,并调用它们。所以,如果它可能会更好(但仍然相对较轻),如果我遇到意外问题或者我做了多余的事情,请告诉我。

+0

现在还不清楚问题是什么。如果您想要查看代码,请将其发布到[此处](https://codereview.stackexchange.com/)。 –

+0

您的方法错误:您的ChildClass实例将不会看到位于ChildClass表中的方法(但它们将从BaseClass表中看到方法)。 –

回答

1

你打破了连锁。从ChildClass.new返回的表格将与ChildClass表格无关。

你会想看看Chapter 16 of Programming in Lua,它讨论了实现面向对象编程的典型方法。

它归结为如果你想维护一个链,你需要使用隐含的self,通过:描述符。您不需要手动定义构造函数,而是通过将其构造为实例来继承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()