面向对象编程的一个特例是对象只有一个方法,在这种情况下,可以不用创建接口表,只要将这个单独的方法以对象的表示形式返回即可。如果感到有点奇怪,那么应该回忆一下诸如 io.lines
或 string.gmatch
这样的迭代器。一个在内部保存了状态的迭代器就是一个单方法对象。
单方法对象的另一种有趣情况是,这个方法其实是一个根据不同的参数完成不同任务的分发方法。这种对象的一种原型实现如下:
function newObject(value) return function (action, v) if action == "get" then return value elseif action == "set" then value = v else error("invalid action") end end end
其使用方法也很简单:
d = newObject(0) print(d("get")) --> 0 d("set",10) print(d("set")) --> 10
这种非传统的对象实现方式是很高效的。虽然 d("set",10)
这样的语法有些奇怪,但也不过是比传统的 d:set(10)
多出了两个字符而已。每个对象使用一个闭包,要比使用一个表的开销更低。虽然使用这种方式不能实现继承,但我们可以拥有完全的私有性:访问单方法对象中某个成员只能通过该对象具有的唯一方法进行。