2012-04-29 23 views
0

我想在Lua中實現繼承類。另外,在創建新對象時,需要進行某種「類型檢查」。在Lua中進行類型檢查的OOP

一個特別的要求是使用特定的語法創建類(示例):

Class({Volkswagen, Vehicle, model=String, speed=Number, driving=Boolean}) 

請注意,參數作爲具有可變長度的列表通過。所以我需要有一個功能,得到的參數的任意數目:

function Class (arguments) 
    name = arguments[1] 
    superclass = arguments[2] 
    ... 
end 

前兩個參數是類的名稱,它是從繼承的類的名稱。

我敢肯定,解決方法很簡單,但我完全不知道如何處理的屬性的鍵值對,例如...

print(arguments.model) 
print(type(arguments.model)) 

...均爲零。任何想法如何我可以得到屬性的類型(字符串,布爾,數字)?

回答

3

這條線:

{Volkswagen, Vehicle, model=String, speed=Number, driving=Boolean} 

並不意味着你認爲這意味着什麼。這是價值觀。

當你做{Volkswagen}時,你在做的是告訴Lua抓取當前存儲在全局表中的字符串名稱"Volkswagen"下的值。我會假設那裏存儲着一些價值。

您的問題是,{model=String}將當前存儲在全局表中的值放在字符串名稱"String"的表中。賠率很好,全局變量名爲"String"。這意味着你把nil放在表格中。

除非LuaJava定義它們,否則「attributes」(String,Boolean,Number)不存在。他們只是空值。你不能傳遞一個空值。你可以通過一個字符串,但這是不同的。

你沒有很好地解釋你的功能究竟應該怎麼做,所以我不能告訴你如何去做你想做的更好的事情。

0

如果你只是在尋找一個通用的Lua類系統,這是我實現: https://gist.github.com/1722329

它不支持類型檢查,但應該有一個「TypedClass」類作爲行動可以輕鬆實現所有嚴格類型的基礎。

0

爲了處理鍵值對,你可能需要使用引用的錶轉移到本地表內置的表函數:

function Class(params) 
local arguments={} 

function transfer(k, v) 
    arguments[k]=v 
end 

--transfer referenced table to local table 
table.foreach (params, transfer) 

print(arguments[1]) 
print(arguments[2]) 
print(arguments.model) 
print(arguments.speed) 
print(arguments.driving) 

類({「大衆」,「車輛「,model =」「,speed = 0,driving = false})