16.5 Single-Method的对象实现方法 |
前面的OO程序设计的方法有一种特殊情况:对象只有一个单一的方法。这种情况下,我们不需要创建一个接口表,取而代之的是,我们将这个单一的方法作为对象返回。这听起来有些不可思议,如果需要可以复习一下7.1节,那里我们介绍了如何构造迭代子函数来保存闭包的状态。其实,一个保存状态的迭代子函数就是一个single-method对象。
关于single-method的对象一个有趣的情况是:当这个single-method实际是一个基于重要的参数而执行不同的任务的分派(dispatch)方法时。针对这种对象:
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("get")) --> 10
这种非传统的对象实现是非常有效的,语法d("set",10)虽然很罕见,但也只不过比传统的d:set(10)长两个字符而已。每一个对象是用一个单独的闭包,代价比起表来小的多。这种方式没有继承但有私有性:访问对象状态的唯一方式是通过它的内部方法。
Tcl/Tk 的窗口部件(widgets)使用了相似的方法,在Tk中一个窗口部件的名字表示一个在窗口部件上执行各种可能操作的函数(a widget command)。