2016-11-02 40 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()