在Lua中使用类型检查的面向对象编程

我正在尝试在 Lua 中实现继承的类。此外,在创建新对象时,需要进行某种“类型检查”。

一个特定的要求是使用特定的语法来创建类(示例):

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))

...两者都是 nil。有没有想法如何获取属性的类型(String、Boolean、Number)?

原文链接 https://stackoverflow.com/questions/10371838

点赞
stackoverflow用户734069
stackoverflow用户734069

这一行:

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

并不像你想的那样。这只是值而已。

当你使用 {Volkswagen} 时,你告诉 Lua 去全局表中找到字符串名称为“Volkswagen”的值。我假设那里存有某个值。

你的问题在于 {model = String} 将当前全局表中字符串名称为“String”的值存入表格中。很有可能根本没有名为“String”的全局变量。这意味着你把 nil 存入了表格中。

除非 LuaJava 定义了它们,否则这些“属性”(String、Boolean、Number)并不存在。它们只是空值。你不能传递一个空值。你可以传递一个 _字符串_,但这是不同的。

你没有很好地解释你的 Class 函数应该做什么,所以我无法提供更好的提示来解决你试图解决的问题。

2012-04-29 12:52:34
stackoverflow用户837856
stackoverflow用户837856

如果您仅仅需要一个通用的Lua类系统,这里是我的实现: https://gist.github.com/1722329

它不支持类型检查,但是这可以通过一个名为“TypedClass”的类来轻松实现,它可作为所有严格类型化类的基础。

2012-04-29 14:56:35
stackoverflow用户1226954
stackoverflow用户1226954

为了处理键值对,您可能需要使用内置的table函数将引用表转换为本地表:

function Class(params)
local arguments={}

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

--将引用表转换为本地表
table.foreach (params, transfer)

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

end

Class({"Volkswagen","Vehicle", model="" , speed=0 , driving=false} )
2012-04-29 16:15:03